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

分组记录的求和与计数:如何升级SQL实现分组汇总

如何在SQL中实现分组后添加分组汇总行?

原始数据表

Col1Col2Col3
R1C15
R2C38
R1C12
R1C24
R2C53
R2C24

需求

  • 按Col1和Col2分组,统计每组的记录数(Count)以及Col3的SUM值;
  • 在上述分组结果基础上,按Col1相同值汇总Count列的总和与Sum列的总和,生成带汇总行的结果。

已实现需求1的SQL语句

SELECT Col1, Col2, COUNT(*) AS Count, SUM(Col3) AS Sum
FROM myTable 
GROUP BY Col1, Col2

需求1的返回结果

Col1Col2CountSum
R1C127
R1C214
R2C214
R2C318
R2C513

需求2的预期结果

Col1Col2CountSum
R1C127
R1C214
311
R2C214
R2C318
R2C513
315

解决方案

方法1:使用ROLLUP(适用于MySQL 8.0+、SQL Server、PostgreSQL等支持SQL:2003标准的数据库)

ROLLUP可自动生成分组汇总行,配合GROUPING函数区分明细与汇总行:

SELECT 
  CASE WHEN GROUPING(Col2) = 1 THEN '' ELSE Col1 END AS Col1,
  CASE WHEN GROUPING(Col2) = 1 THEN '' ELSE Col2 END AS Col2,
  COUNT(*) AS Count,
  SUM(Col3) AS Sum
FROM myTable
GROUP BY Col1, Col2 WITH ROLLUP
HAVING GROUPING(Col1) = 0
ORDER BY Col1, GROUPING(Col2);
  • GROUPING(Col2) = 1标识该行是同一Col1下所有Col2的汇总行
  • HAVING GROUPING(Col1) = 0过滤掉全表总汇总行,仅保留各Col1的分组汇总
  • ORDER BY确保明细行在前,对应汇总行在后

方法2:通用UNION ALL方法(适用于所有数据库)

先获取分组明细,再单独统计各Col1的汇总,最后合并结果并排序:

SELECT Col1, Col2, Count, Sum
FROM (
  -- 分组明细行
  SELECT Col1, Col2, COUNT(*) AS Count, SUM(Col3) AS Sum, 1 AS sort_order
  FROM myTable
  GROUP BY Col1, Col2
  UNION ALL
  -- 各Col1的汇总行
  SELECT Col1, '', SUM(Count) AS Count, SUM(Sum) AS Sum, 2 AS sort_order
  FROM (
    SELECT Col1, Col2, COUNT(*) AS Count, SUM(Col3) AS Sum
    FROM myTable
    GROUP BY Col1, Col2
  ) t
  GROUP BY Col1
) combined
ORDER BY Col1, sort_order;
  • sort_order字段区分明细行(1)与汇总行(2),保证排序后汇总行在对应Col1的明细行之后
  • 汇总行的Col2设为空字符串,匹配预期结果格式

内容的提问来源于stack exchange,提问作者DeFacto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:01:34