SQL多分组查询需求:无需UNION/CTE实现双聚合统计
解决方案:无需UNION/CTE实现双聚合计算
当然可以实现!你完全不需要依赖UNION或者CTE语法,利用窗口函数(主流数据库普遍支持)或者关联子查询就能轻松完成需求,下面分两种场景给出具体实现:
方法一:使用窗口函数(推荐,简洁高效)
窗口函数可以在分组统计旬总和的同时,直接计算出对应月份的总金额,写法非常直观:
SELECT Year, Month, TenDays, SUM(Pay) AS TotalTenDays, SUM(SUM(Pay)) OVER(PARTITION BY Year, Month) AS TotalMonth FROM 你的表名 GROUP BY Year, Month, TenDays ORDER BY Year, Month, TenDays;
逻辑说明:
- 先按
Year, Month, TenDays分组,用SUM(Pay)计算每旬的总金额TotalTenDays; - 外层的
SUM(SUM(Pay)) OVER(PARTITION BY Year, Month)是窗口聚合:它会将同一Year和Month的所有分组行,关联计算出该月份的总金额,自动填充到每一行的TotalMonth字段中; - 最终结果完全匹配你给出的预期输出,比如2016年8月的
TotalMonth会统一显示为54(43+11),2016年9月统一显示为84(22+33+4+25)。
方法二:关联子查询(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x及更早版本),可以用关联子查询来实现,同样不需要UNION或CTE:
SELECT t1.Year, t1.Month, t1.TenDays, SUM(t1.Pay) AS TotalTenDays, (SELECT SUM(t2.Pay) FROM 你的表名 t2 WHERE t2.Year = t1.Year AND t2.Month = t1.Month) AS TotalMonth FROM 你的表名 t1 GROUP BY t1.Year, t1.Month, t1.TenDays ORDER BY t1.Year, t1.Month, t1.TenDays;
逻辑说明:
- 主查询同样按
Year, Month, TenDays分组计算TotalTenDays; - 子查询通过关联
Year和Month,单独计算对应月份的总金额,返回给主查询的TotalMonth字段; - 这种写法兼容性更强,但性能略逊于窗口函数(尤其是数据量较大时)。
内容的提问来源于stack exchange,提问作者R. Salehi
相关产品推荐
相关产品推荐

