除了 ROLLUP 子句提供的分层分组模式外,您还可以通过 CUBE 子句创建数据立方体,即通过 GROUP BY 表达式的每种可能组合对输入进行
n
维汇总。CUBE 子句最终会生成每组值的元素的所有可能组合的积集。这在进行复杂数据分析时会很有用。
如果 CUBE 子句中有
n
个 GROUPING 表达式,其格式为 (X
1
,X
2
, ...,X
n
),则 CUBE 将生成 2
n
个分组集,如下所示:
{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ...,Xn),
(X2), (X2,X3), (X2,X3,X4), ... , (X2,X3,X4, ... , Xn), ... , (Xn)}.
以下查询按年份、季度和年份中每季对销售订单进行了汇总,并生成了下表中所示的结果集:
SELECT QUARTER( OrderDate ) AS Quarter,
YEAR( OrderDate ) AS Year,
COUNT( * ) AS Orders,
GROUPING( Quarter ) AS GQ,
GROUPING( Year ) AS GY
FROM SalesOrders
GROUP BY CUBE ( Year, Quarter )
ORDER BY Year, Quarter;
此查询会返回以下结果:
结果集中的第一行显示 2000 和 2001 两年中所有季度全部订单的总计 (648)。
第 2-5 行按任何年份中的日历季度对销售订单进行了汇总。
第 6 和 11 行分别显示 2000 和 2001 年的总订单数。
第 7-10 行和第 12-14 行分别显示 2000 和 2001 年的季度订单总数。
注意 GROUPING 函数返回的值是如何用于区分包含总计的行和小计行的。对于第 6 行和第 11 行,季度 (Quarter) 列中出现 NULL 且 GQ 列的值为 1(Grouping by Quarter,按季度分组),这表示该行为该年所有季度的订单总计。
使用 CUBE 生成的结果集可能会非常大,因为 CUBE 呈指数方式生成分组集。鉴于此原因,不支持包含超过 64 个 GROUP BY 表达式的 GROUP BY 子句。如果语句超出此限制,则语句将失败,并且会报告错误 SQLCODE -944
(SQLSTATE 42WA1)。