除了 ROLLUP 子句提供的分层分组模式外,您还可以通过 CUBE 子句创建数据立方体,即通过 GROUP BY 表达式的每种可能组合对输入进行 n 维汇总。CUBE 子句最终会生成每组值的元素的所有可能组合的积集。这在进行复杂数据分析时会很有用。
如果 CUBE 子句中有 n 个 GROUPING 表达式,其格式为 (X1,X2, ...,Xn),则 CUBE 将生成 2n 个分组集,如下所示:
{(), (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; |
此查询会返回以下结果:
Quarter | Year | Orders | GQ | GY | |
---|---|---|---|---|---|
1 | (NULL) | (NULL) | 648 | 1 | 1 |
2 | 1 | (NULL) | 226 | 0 | 1 |
3 | 2 | (NULL) | 196 | 0 | 1 |
4 | 3 | (NULL) | 101 | 0 | 1 |
5 | 4 | (NULL) | 125 | 0 | 1 |
6 | (NULL) | 2000 | 380 | 1 | 0 |
7 | 1 | 2000 | 87 | 0 | 0 |
8 | 2 | 2000 | 77 | 0 | 0 |
9 | 3 | 2000 | 91 | 0 | 0 |
10 | 4 | 2000 | 125 | 0 | 0 |
11 | (NULL) | 2001 | 268 | 1 | 0 |
12 | 1 | 2001 | 139 | 0 | 0 |
13 | 2 | 2001 | 119 | 0 | 0 |
14 | 3 | 2000 | 10 | 0 | 0 |
结果集中的第一行显示 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 呈指数方式生成分组集。为此,SQL Anywhere 不允许 GROUP BY 子句包含的 GROUP BY 表达式超过 64 个。如果语句超出此限制,则语句将失败,并且会报告错误 SQLCODE -944 (SQLSTATE 42WA1)。
有关 CUBE 子句语法的详细信息,请参见GROUP BY 子句。
或者,也可使用 Transact-SQL 兼容语法 WITH CUBE 实现与 GROUP BY CUBE 相同的结果。不过,该语法稍有不同,只可在此语法中提供简单的 GROUP BY 表达式列表。
以下查询将产生与先前的 GROUP BY CUBE 示例相同的结果:
SELECT QUARTER( OrderDate ) AS Quarter, YEAR( OrderDate ) AS Year, COUNT( * ) AS Orders, GROUPING( Quarter ) AS GQ, GROUPING( Year ) AS GY FROM SalesOrders GROUP BY Year, Quarter WITH CUBE ORDER BY Year, Quarter; |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |