You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:08