我有以下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
它给出了以下结果
我希望它返回1行,其中包含曝光量和所有行的等效值。其余的细胞与InternalId相同,我真的不需要(我可以从查询中删除它)
我不是很擅长sql。谢谢你的帮助。
答案 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, ...
在您的具体情况下,群组字段为BrandId
,ChannelId
和ChannelName
;总和字段为ExposureAmount
和Equivalent
。
注意:为了便于阅读(因为您的原始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, ...
请注意,使用公用表表达式时,前面的语句必须以分号结束。