Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » OLAP 支持 » 使用 ROLLUP 和 CUBE 作为 GROUPING SETS 的快捷方式

 

使用 CUBE

除了 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 子句

支持 T-SQL WITH CUBE 语法

或者,也可使用 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;