sql sum group by

时间:2015-02-25 13:00:05

标签: sql sql-server group-by sum

我有以下sql查询

  DECLARE @frameInt INT

SELECT TOP 1 @frameInt = gs.FrameGenerationInterval
FROM dbo.GlobalSettings gs

SELECT mti.InternalId,
        b.InternalId AS BrandId,
        CASE 
            WHEN DATEDIFF(second, mti.StartTime, mti.EndTime) / @frameInt > 0 THEN DATEDIFF(second, mti.StartTime, mti.EndTime) / @frameInt
            ELSE 1
        END AS ExposureAmount,
        c.InternalId AS ChannelId,
        c.Name AS ChannelName,

        COALESCE( (p.Rating * 
            CASE 
                WHEN DATEDIFF(second, mti.StartTime, mti.EndTime) / @frameInt > 0 THEN DATEDIFF(second, mti.StartTime, mti.EndTime) / @frameInt
                ELSE 1
            END * CAST (17.5 AS decimal(8,2))
        ),CAST( 0 as decimal(8,2)) ) AS Equivalent


    FROM dbo.MonitorTelevisionItems mti
        LEFT JOIN dbo.Brands b ON mti.BrandId = b.InternalId
        LEFT JOIN dbo.Channels c ON mti.ChannelId = c.InternalId
        LEFT JOIN dbo.Programs p ON mti.ProgramId = p.InternalId
    --WHERE mti.Date >= @dateFromLocal AND mti.Date <= @dateToLocal
    GROUP BY mti.InternalId,  mti.EndTime, mti.StartTime,
        c.Name, p.Name, p.Rating,b.InternalId,  c.InternalId

它给出了以下结果

result

我希望它返回1行,其中包含曝光量和所有行的等效值。其余的细胞与InternalId相同,我真的不需要(我可以从查询中删除它)

我不是很擅长sql。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

为了后人(并且因为学习新东西很酷),这里是您的问题的通用解决方案(而不是针对您的特定情况的复制和粘贴就绪解决方案):

SELECT group_field1, group_field2, ..., 
       SUM(sum_field1), SUM(sum_field2), ...

  FROM (...your original SQL...) AS someArbitraryAlias

 GROUP BY group_field1, group_field2, ...

在您的具体情况下,群组字段为BrandIdChannelIdChannelName;总和字段为ExposureAmountEquivalent


注意:为了便于阅读(因为您的原始SQL非常复杂),您可以使用公用表表达式

WITH someArbitraryAlias AS (
    ...your original SQL...
)

SELECT group_field1, group_field2, ..., 
       SUM(sum_field1), SUM(sum_field2), ...

  FROM someArbitraryAlias

 GROUP BY group_field1, group_field2, ...

请注意,使用公用表表达式时,前面的语句必须以分号结束。