SQL中的GROUP BY ROLLUP是专门用于生成层级汇总数据的扩展语法,它可以在一次查询中同时返回明细数据、各层级小计以及最终总计,避免手动编写多个UNION查询的繁琐操作。

ROLLUP的基本语法逻辑
ROLLUP是GROUP BY的子句扩展,使用时只需要将需要汇总的维度列放在ROLLUP括号内即可,语法结构如下:
SELECT 维度列1, 维度列2, 聚合函数(指标列) FROM 表名 GROUP BY ROLLUP(维度列1, 维度列2);
ROLLUP会按照括号内列的顺序从右到左依次减少维度生成汇总层级,比如ROLLUP(a,b,c)会生成以下4种分组结果:
- GROUP BY a,b,c:最细粒度的明细分组
- GROUP BY a,b:对c维度的小计
- GROUP BY a:对b、c维度的更高层级小计
- 无分组维度:全表总计
实际场景示例:员工薪资统计
假设我们有员工薪资表employee_salary,表结构如下:
| 列名 | 类型 | 说明 |
|---|---|---|
| dept_name | VARCHAR | 部门名称 |
| job_title | VARCHAR | 岗位名称 |
| salary | INT | 月薪 |
现在需要统计每个部门下各岗位的平均薪资,同时生成部门小计和全公司总计,使用ROLLUP的查询语句如下:
SELECT
COALESCE(dept_name, '全公司总计') AS 部门,
COALESCE(job_title, '部门小计') AS 岗位,
AVG(salary) AS 平均薪资
FROM employee_salary
GROUP BY ROLLUP(dept_name, job_title)
ORDER BY
CASE WHEN dept_name IS NULL THEN 2 ELSE 1 END,
dept_name,
CASE WHEN job_title IS NULL THEN 2 ELSE 1 END,
job_title;
这里使用COALESCE函数处理ROLLUP生成的NULL值,NULL值代表对应维度被汇总,替换为更易读的文本。查询结果会先展示每个部门下各岗位的明细平均薪资,接着是该部门的小计,最后是全公司的平均薪资总计。
通用自动生成模板
可以将上述逻辑抽象为通用模板,只需要替换表名、维度列和聚合指标即可复用:
SELECT
-- 处理维度列的NULL值,替换为小计/总计文本
COALESCE(维度列1, '总计') AS 维度列1别名,
COALESCE(维度列2, '小计') AS 维度列2别名,
-- 聚合计算
聚合函数(指标列) AS 指标别名
FROM 目标表名
GROUP BY ROLLUP(维度列1, 维度列2)
ORDER BY
-- 排序逻辑,让小计和总计排在对应分组末尾
CASE WHEN 维度列1 IS NULL THEN 2 ELSE 1 END,
维度列1,
CASE WHEN 维度列2 IS NULL THEN 2 ELSE 1 END,
维度列2;
注意事项
- ROLLUP的维度列顺序很重要,顺序不同生成的汇总层级也会不同,需要根据实际统计需求调整列的顺序
- 如果不需要所有层级的汇总,可以结合
GROUPING函数过滤结果,GROUPING(列名)返回1代表该列被汇总,返回0代表该列参与分组 - ROLLUP是SQL标准的扩展语法,大部分主流数据库如MySQL、PostgreSQL、Oracle、SQL Server都支持,但部分低版本数据库可能需要调整语法
使用ROLLUP可以大幅简化多层级汇总的SQL编写,减少多次查询和UNION操作带来的性能损耗,是数据统计场景的常用技巧。
SQLGROUP_BY_ROLLUP小计生成总计生成修改时间:2026-06-14 21:48:23