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, ...
在您的特定情况下,组字段将为 BrandId
、ChannelId
和 ChannelName
;总和字段将是 ExposureAmount
和 Equivalent
.
注意:为了提高可读性(因为您的原始 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 表达式时,前面的语句必须以分号结束。
我有以下 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, ...
在您的特定情况下,组字段将为 BrandId
、ChannelId
和 ChannelName
;总和字段将是 ExposureAmount
和 Equivalent
.
注意:为了提高可读性(因为您的原始 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 表达式时,前面的语句必须以分号结束。