ROLLUP 是 SQL 中一种分组操作,它生成多个分组集的小计行和总计行,提供层次化的汇总数据。
基本语法
sql
SELECT column1, column2, ..., aggregate_function(column)
FROM table
GROUP BY ROLLUP (column1, column2, ...);
使用示例
假设有一个销售表 sales
sql
SELECT
region,
product,
SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP (region, product);
这个查询会生成:
-
每个地区每种产品的销售总额(最细粒度)
-
每个地区所有产品的销售小计
-
所有地区所有产品的销售总计
多列 ROLLUP
sql
SELECT
year,
quarter,
month,
SUM(revenue) AS total_revenue
FROM financial_data
GROUP BY ROLLUP (year, quarter, month);
这会生成:
-
每年每季度每月的收入
-
每年每季度的收入小计
-
每年的收入小计
-
总收入总计
部分 ROLLUP
sql
SELECT
department,
job_title,
gender,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department, ROLLUP (job_title, gender);
结合其他 GROUP BY 功能
sql
SELECT
store_id,
product_category,
product_subcategory,
SUM(sales) AS total_sales
FROM retail_data
GROUP BY GROUPING SETS (
(store_id, product_category, product_subcategory),
ROLLUP (store_id, product_category)
);
识别汇总行
sql
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
CASE WHEN GROUPING(product) = 1 THEN 'All Products' ELSE product END AS product,
SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP (region, product);
注意事项
-
ROLLUP 生成的分组集是从最详细到最不详细的层次结构
-
列的顺序会影响结果,ROLLUP(a,b,c) 与 ROLLUP(c,b,a) 结果不同
-
在 MySQL 中,ROLLUP 不能与 ORDER BY 一起使用(除非使用 LIMIT)
ROLLUP 是生成层次化报表的强大工具,特别适合需要多级汇总的商业报表场景。