Skip to main content

SELECT WITH ROLLUP

WITH ROLLUP可以在查询结果中添加汇总行,表示对所有行进行聚合计算的结果。这些汇总行的列值为 NULL,它们对应的是多个 GROUP BY 列的聚合计算结果。如果在查询中有多个聚合函数,则会为每个聚合函数添加一个汇总行。

具体用法示例

针对生成的employees数据表,表格的生成方式可以查看测试表格生成 emloyees表的具体信息如下: 该表主要用于存储员工的基本信息

字段名类型含义
employee_idint(6)员工的唯一标识
first_namevarchar(20)员工的首名
last_namevarchar(25)员工的末名
emailvarchar(25)员工的邮件地址
phone_numbervarchar(20)员工的电话号码
hire_datedate员工的雇佣日期
job_idvarchar(10)员工的工作类型标识
salarydouble(8,2)员工的薪水
commission_pctdouble(2,2)员工的佣金提成
manager_idint(6)员工的主管人员标识
department_idint(4)员工所在的部门标识(关联至departments)
  • 按部门 ID 对员工进行分组,并计算每个部门的平均薪资和总薪资,以及所有部门的总薪资:
SELECT department_id, AVG(salary) AS avg_salary, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id WITH ROLLUP;

查询结果如下:

+---------------+--------------+--------------+
| department_id | avg_salary | total_salary |
+---------------+--------------+--------------+
| NULL | 7000.000000 | 7000.00 |
| 10 | 4400.000000 | 4400.00 |
| 20 | 9500.000000 | 19000.00 |
| 30 | 4150.000000 | 24900.00 |
| 40 | 6500.000000 | 6500.00 |
| 50 | 3475.555556 | 156400.00 |
| 60 | 5760.000000 | 28800.00 |
| 70 | 10000.000000 | 10000.00 |
| 80 | 8955.882353 | 304500.00 |
| 90 | 19333.333333 | 58000.00 |
| 100 | 8600.000000 | 51600.00 |
| 110 | 10150.000000 | 20300.00 |
| NULL | 6461.682243 | 691400.00 |
+---------------+--------------+--------------+
13 rows in set (0.078 sec)
  • 按入职年份对员工进行分组,并计算每个年份的员工数量和总薪资,以及所有年份的总薪资:
SELECT YEAR(hire_date) AS hire_year, COUNT(*) AS emp_count, SUM(salary) AS total_salary
FROM employees
GROUP BY YEAR(hire_date) WITH ROLLUP;

输出结果如下:

+-----------+-----------+--------------+
| hire_year | emp_count | total_salary |
+-----------+-----------+--------------+
| 1987 | 2 | 28400.00 |
| 1989 | 1 | 17000.00 |
| 1990 | 1 | 9000.00 |
| 1991 | 1 | 6000.00 |
| 1993 | 1 | 17000.00 |
| 1994 | 7 | 68800.00 |
| 1995 | 4 | 18100.00 |
| 1996 | 10 | 86000.00 |
| 1997 | 28 | 180900.00 |
| 1998 | 23 | 112100.00 |
| 1999 | 18 | 88900.00 |
| 2000 | 11 | 59200.00 |
| NULL | 107 | 691400.00 |
+-----------+-----------+--------------+
13 rows in set (0.006 sec)
  • 按职位 ID 和部门 ID 对员工进行分组,并计算每个职位在每个部门的员工数量和总薪资,以及所有职位和所有部门的总薪资:
SELECT job_id, department_id, COUNT(*) AS emp_count, SUM(salary) AS total_salary
FROM employees
GROUP BY job_id, department_id WITH ROLLUP;

输出结果如下:

+------------+---------------+-----------+--------------+
| job_id | department_id | emp_count | total_salary |
+------------+---------------+-----------+--------------+
| AC_ACCOUNT | 110 | 1 | 8300.00 |
| AC_ACCOUNT | NULL | 1 | 8300.00 |
| AC_MGR | 110 | 1 | 12000.00 |
| AC_MGR | NULL | 1 | 12000.00 |
| AD_ASST | 10 | 1 | 4400.00 |
...
| ST_CLERK | 50 | 20 | 55700.00 |
| ST_CLERK | NULL | 20 | 55700.00 |
| ST_MAN | 50 | 5 | 36400.00 |
| ST_MAN | NULL | 5 | 36400.00 |
| NULL | NULL | 107 | 691400.00 |
+------------+---------------+-----------+--------------+
40 rows in set (0.013 sec)

这些查询使用WITH ROLLUP关键字来添加汇总行,并对不同的分组进行聚合计算,可以方便用户进行数据分析和报表制作。

注意 不能在使用 WITH ROLLUP 的同时使用 ORDER BY 子句进行排序。虽然可以使用 ASC 或 DESC 子句对 GROUP BY 列进行排序,但超级聚合行总是会被添加到结果集的末尾。

MySQL 兼容性

SELECT WITH ROLLUP语句与 MySQL 8.0 的“SELECT WITH ROLLUP”功能完全兼容

更多详情,请参考mariadb

WITH ROLLUP