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

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;

逻辑说明:

  1. 先按Year, Month, TenDays分组,用SUM(Pay)计算每旬的总金额TotalTenDays;
  2. 外层的SUM(SUM(Pay)) OVER(PARTITION BY Year, Month)是窗口聚合:它会将同一Year和Month的所有分组行,关联计算出该月份的总金额,自动填充到每一行的TotalMonth字段中;
  3. 最终结果完全匹配你给出的预期输出,比如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;

逻辑说明:

  1. 主查询同样按Year, Month, TenDays分组计算TotalTenDays;
  2. 子查询通过关联Year和Month,单独计算对应月份的总金额,返回给主查询的TotalMonth字段;
  3. 这种写法兼容性更强,但性能略逊于窗口函数(尤其是数据量较大时)。

内容的提问来源于stack exchange,提问作者R. Salehi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:45:45