sql 总和分组依据

sql sum group by

我有以下 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

结果如下

我希望它成为 return 1 行,其中包含所有行的曝光量和等效值的总和。除了我不需要的 InternalId(我可以从查询中删除它)之外,其余的单元格都是一样的

我不太擅长sql。感谢帮助。

为了子孙后代(也因为学习新东西很酷),这是针对您的问题的一般解决方案(而不是复制和粘贴的现成解决方案您的具体情况):

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 非常复杂),您可以使用 常用 table 表达式 :

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, ...

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