一、核心概念对比
ROLLUP(层级汇总)
- 定义:生成层次化汇总,按指定列顺序从最细粒度逐步汇总到最高层。
- 适用场景:需逐级汇总的场景,如按时间(年→月→日)、地理(国家→省→市)等维度。
- 示例 :
ROLLUP(YEAR(d_date), MONTH(d_date))会生成:- 年+月维度(如 2001 年 1 月)
- 年仅维度(如 2001 年)
- 总计(所有年份)
CUBE(全组合汇总)
- 定义:生成所有可能的维度组合汇总,比 ROLLUP 更全面。
- 适用场景:需分析所有维度组合的场景,如业务分析、市场调查。
- 示例 :
CUBE(YEAR(d_date), i_category)会生成:- 年+品类(如 2001 年 Books)
- 年仅(2001 年)
- 品类仅(Books)
- 总计
GROUPING SETS(自定义组合汇总)
- 定义:指定特定维度组合进行汇总,比 ROLLUP/CUBE 更灵活。
- 适用场景:仅需部分维度组合时,避免计算不必要的汇总,提升效率。
- 示例 :
GROUPING SETS((YEAR(d_date), i_category), (YEAR(d_date)), ())会生成:- 年+品类
- 年仅
- 总计
二、关键函数:解决 NULL 值歧义
GROUPING 函数
- 作用:区分汇总行(由 ROLLUP/CUBE 生成)和原始数据中的 NULL 值。
- 规则 :
- 若列是汇总行(如 ROLLUP 生成的"年总计"),返回 1。
- 若列是原始数据的 NULL 或普通值,返回 0。
- 示例 :
GROUPING(YEAR(d_date))可判断"年"列是否为汇总行。
GROUPING_ID 函数
- 作用:用二进制位标识维度组合,更直观区分汇总层级。
- 示例 :
CUBE(a,b)的 GROUPING_ID 对应:a,b(明细行)→ 00 → ID=0a(b 汇总)→ 01 → ID=1b(a 汇总)→ 10 → ID=2- 总计 → 11 → ID=3
三、语法与示例
ROLLUP 语法
sql
SELECT YEAR(d_date), MONTH(d_date), SUM(ss_net_paid)
FROM store_sales
GROUP BY ROLLUP(YEAR(d_date), MONTH(d_date));
- 结果:包含年+月、年仅、总计三层汇总。
CUBE 语法
sql
SELECT YEAR(d_date), i_category, SUM(ss_net_paid)
FROM store_sales
GROUP BY CUBE(YEAR(d_date), i_category);
- 结果:包含年+品类、年仅、品类仅、总计四层汇总。
GROUPING SETS 语法
sql
SELECT YEAR(d_date), i_category, SUM(ss_net_paid)
FROM store_sales
GROUP BY GROUPING SETS(
(YEAR(d_date), i_category), -- 年+品类
(YEAR(d_date)), -- 年仅
() -- 总计
);
四、应用场景总结
| 功能 | 适用场景 | 优势 |
|---|---|---|
| ROLLUP | 层级汇总(如时间、地理) | 简洁,避免冗余汇总 |
| CUBE | 全维度组合分析(如市场调查) | 覆盖所有可能组合 |
| GROUPING SETS | 自定义部分维度组合(如仅需年+品类) | 灵活,减少计算资源消耗 |
五、注意事项
- NULL 值处理:汇总行的 NULL 是"虚拟"的(由 ROLLUP/CUBE 生成),需用 GROUPING 函数区分。
- 性能优化:若仅需部分维度组合,优先用 GROUPING SETS 而非 CUBE,避免计算不必要的汇总。