1、CUBE
是 GROUP BY 子句的一个扩展,用于生成一个结果集,该结果集显示了所选列中所有可能的 组合 的聚合(以及总计)。
- 它本质上是
ROLLUP的超集,能生成更全面的分组集合。 - 为指定的列生成所有可能的分组组合,包括小计和总计。
SELECT col1, col2, ..., aggregate_function(col) FROM table_name GROUP BY CUBE (col1, col2, ..., colN);
如:有两列:A 和 B。GROUP BY CUBE (A, B) 会生成以下所有分组组合:
-
(A, B)- 按 A 和 B 的每个唯一组合进行分组。 -
(A)- 仅按 A 进行分组(对 B 维度进行汇总)。 -
(B)- 仅按 B 进行分组(对 A 维度进行汇总)。 -
()- 对所有行进行总计(对 A 和 B 两个维度都进行汇总)。
分组组合的数量是 2n,其中 n 是 CUBE 中的列数。对于 2 列,是 4 种组合;对于 3 列,是 8 种组合。
表 sales:
| region | product | amount |
|---|---|---|
| North | Apple | 100 |
| North | Banana | 200 |
| South | Apple | 150 |
| South | Banana | 250 |
查询语句:
SELECT region, product, SUM(amount) AS total FROM sales GROUP BY CUBE(region, product);
结果(共 2² = 4 种分组 + 原始数据行):
| region | product | total |
|---|---|---|
| North | Apple | 100 |
| North | Banana | 200 |
| South | Apple | 150 |
| South | Banana | 250 |
| North | NULL | 300 |
| South | NULL | 400 |
| NULL | Apple | 250 |
| NULL | Banana | 450 |
| NULL | NULL | 700 |
注意:
CUBE(region, product)包含了:
- (region, product)
- (region)
- (product)
- ()
而 ROLLUP(region, product) 只包含前三种中的 (region, product) → (region) → (),不会单独按 product 汇总。