0

GroupBy を実行したい既存の作業中の SQL クエリがありますが、次のエラーが表示されます:集計またはサブクエリを含む式で集計関数を実行できません。

私のシナリオの説明:

私のメイン テーブル (dbo.DataLog) には、TimestampUTC、MeterTagId、Data の3 つの列が含まれています。

通常、データは 15 分間隔で受信され、各 TimestampUTCに対して多くのメーター ( MeterTagId ) があります。データ列はフロートで、これは合計値です。つまり、メーター期間の実際の値を取得するには、現在の値から最後の値を引く必要があります。今までは個々のメーターのクエリに成功していましたが、今は時間ごとにグループ化し、その時間のすべてのメーターの合計/合計を表示しようとしています。

元の作業非合計クエリ:

 SELECT
    l.TimestampUTC
    -- Get this value minus the last value
    ,(SELECT  (l.[Data] - 
                (   SELECT TOP 1 l2.Data
                    FROM [DataLog] l2
                    WHERE l2.MeterTagId = l.MeterTagId
                    AND l2.TimestampUTC < l.TimestampUTC
                    ORDER BY l2.TimestampUTC DESC)
                )
        ) AS Actual_Value
    FROM [dbo].[DataLog] l
    INNER JOIN [dbo].MeterTags t on t.MeterTagId = l.MeterTagId
    INNER JOIN [dbo].Meters m on m.MeterId = t.MeterId
    INNER JOIN [dbo].GroupsMeters gm on gm.MeterId = m.MeterId
    INNER JOIN [dbo].Groups g on g.GroupId = gm.GroupId
    LEFT OUTER JOIN dbo.Units u on u.UnitId = t.UnitId
    WHERE (@MeterId is null OR M.MeterId in (@MeterId))
    AND (@MeterTagId is null OR t.MeterTagId in (@MeterTagId))
    AND (@StartDate is null OR l.TimestampUTC >= @StartDate)
    AND (@EndDate is null OR l.TimestampUTC <= @EndDate)
    AND (@GroupId is null OR g.GroupId in (@GroupId))

.

要約を取得しようとする私の試み:

 SELECT
    l.TimestampUTC
    -- Get this value minus the last value
    ,   (SELECT  SUM(l.[Data] - 
                (   SELECT TOP 1 l2.Data
                    FROM [DataLog] l2
                    WHERE l2.MeterTagId = l.MeterTagId
                    AND l2.TimestampUTC < l.TimestampUTC
                    ORDER BY l2.TimestampUTC DESC)
                )
        )AS Actual_Value
    FROM [dbo].[DataLog] l
    INNER JOIN [dbo].MeterTags t on t.MeterTagId = l.MeterTagId
    INNER JOIN [dbo].Meters m on m.MeterId = t.MeterId
    INNER JOIN [dbo].GroupsMeters gm on gm.MeterId = m.MeterId
    INNER JOIN [dbo].Groups g on g.GroupId = gm.GroupId
    LEFT OUTER JOIN dbo.Units u on u.UnitId = t.UnitId
    WHERE (@MeterId is null OR M.MeterId in (@MeterId))
    AND (@MeterTagId is null OR t.MeterTagId in (@MeterTagId))
    AND (@StartDate is null OR l.TimestampUTC >= @StartDate)
    AND (@EndDate is null OR l.TimestampUTC <= @EndDate)
    AND (@GroupId is null OR g.GroupId in (@GroupId))
    AND t.Name ='Real Energy Net'
    GROUP BY l.TimestampUTC

ここで他の投稿を読んだことがありますが、必要なロジックについて理解できません。これは、SQL 開発者が定期的に遭遇するものだと思いますか? ありがとう!

4

1 に答える 1

1

OK、私はそれを解決しました、それは本当に簡単です。この説明が、将来同じ問題を抱えている他の人に役立つことを願っています。

SELECT 
    myTable.TimestampUTC
    , SUM(myTable.Actual_Value) as [Actual Value]
FROM
(
--My original query
) AS myTable

GROUP BY myTable.TimestampUTC
于 2013-10-28T05:49:34.960 に答える