【问题标题】:SQL add Sum to existing query (Cannot perform an aggregate function on an expression containing an aggregate or a subquery.)SQL 将 Sum 添加到现有查询(无法对包含聚合或子查询的表达式执行聚合函数。)
【发布时间】:2013-10-28 05:27:45
【问题描述】:

我有一个现有的 SQL 查询,我现在想使用 GroupBy,但出现错误:无法对包含聚合或子查询的表达式执行聚合函数。

我的场景说明:

我的主表 (dbo.DataLog) 包含 3 列,TimestampUTC、MeterTagId、Data

数据通常每隔 15 分钟输入一次,我有很多仪表 (MeterTagId) 时间戳UTCData 列是一个浮点数,这是一个累加值。即要获得一个仪表周期的实际值,我需要从当前值中减去最后一个值。在此之前,我已成功查询单个仪表,但现在我尝试按时间分组并显示该时间所有仪表的总和/总计。

原始工作非求和查询:

 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 开发人员经常遇到的问题?谢谢!

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案1】:

    好的,我解决了,真的很简单。希望这个解释可以帮助其他人在未来遇到同样的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多