如何将Union All合并的多日期行结果聚合为单日期单行?
解决按日期聚合多查询结果的问题
你的当前查询之所以每个日期返回三行,是因为外层GROUP BY包含了ServiceDetail、QueueGroupEmail、QueueGroupChat这三个字段——每个子查询的结果里,只有一个字段是计数数值,另外两个是空字符串,这会被判定为不同的分组,所以拆成了三行。另外,用空字符串作为非统计字段的值会干扰数值聚合,应该替换为0。
修正后的查询代码如下:
select x.CountDate, SUM(x.ServiceDetail) as ServiceDetail, SUM(x.QueueGroupEmail) as QueueGroupEmail, SUM(x.QueueGroupChat) as QueueGroupChat from (select convert(date, a.Date) as CountDate, count(*) as ServiceDetail, 0 as QueueGroupEmail, 0 as QueueGroupChat from GlobalServiceDetailImport a where Date >= '1/1/2024' group by convert(date, a.Date) union all select convert(date, b.Date) as CountDate, 0 as ServiceDetail, count(*) as QueueGroupEmail, 0 as QueueGroupChat from GlobalQueueGroupEmailImport b where Date >= '1/1/2024' group by convert(date, b.Date) union all select convert(date, c.Date) as CountDate, 0 as ServiceDetail, 0 as QueueGroupEmail, count(*) as QueueGroupChat from GlobalChatServiceSummaryImport c where Date >= '1/1/2024' group by convert(date, c.Date) ) x group by x.CountDate order by x.CountDate desc;
关键调整说明:
- 子查询中,将不需要统计的字段值从
''改为0,确保所有统计字段都是数值类型,避免聚合出错 - 外层仅按
CountDate分组,对每个统计字段使用SUM()函数,把同一日期下的各子查询结果合并为一行 - 后续要添加15-20个类似查询时,只需要延续这个规则:每个子查询只统计目标字段,其余字段设为
0,外层保持GROUP BY CountDate和SUM各统计字段即可
你提到的ROW_NUMBER() OVER(PARTITION...)方案并不适用于这个场景——它主要用于分组后取某一行数据(比如取最新/ oldest记录),而你的需求是对分组内的数值进行聚合合并,所以分组+SUM的方式才是正确选择。
内容的提问来源于stack exchange,提问作者MNYANKEE1
相关产品推荐
相关产品推荐

