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 的快捷方式

 

使用 ROLLUP

许多应用程序的一个常见要求是从左到右依次计算分组属性的小计。此模式称为层次,因为引入附加小计计算会额外产生信息详细程度更佳的行。在 SQL Anywhere 中,可使用用以指定 ROLLUP 子句的 ROLLUP 关键字来指定分组属性的层次。

使用 ROLLUP 子句的查询会产生如下的分组集分层系列。如果 ROLLUP 子句含有 n 个 GROUP BY 表达式,其格式为 (X1,X2, ..., Xn),则 ROLLUP 子句将生成 n + 1 个分组集,如下所示:

{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ... , 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 ROLLUP( Year, Quarter )
ORDER BY Year, Quarter;

此查询会返回以下结果:

Quarter Year Orders GQ GY
1 (NULL) (NULL) 648 1 1
2 (NULL) 2000 380 1 0
3 1 2000 87 0 0
4 2 2000 77 0 0
5 3 2000 91 0 0
6 4 2000 125 0 0
7 (NULL) 2001 268 1 0
8 1 2001 139 0 0
9 2 2001 119 0 0
10 3 2001 10 0 0

结果集中的第一行显示两年中所有季度全部订单的总计 (648)。

第 2 行显示 2000 年的订单总数 (380),而第 3-6 行显示同年各季度的订单小计。同理,第 7 行显示 2001 年的订单总数 (268),而第 8-10 行显示同年各季度的订单小计。

注意 GROUPING 函数返回的值是如何用于区分包含总计的行和小计行的。对于第 2 行和第 7 行,季度列中出现 NULL 且 GQ 列(Grouping by Quarter,按季度分组)的值为 1,这表示该行为(每年)所有季度的订单总计。

同理,在第 1 行中,季度 (Quarter) 和年份 (Year) 列中出现 NULL 且 GQ 和 GY 列中出现值 1,这表示该行为所有季度和所有年份的订单总计。

有关 ROLLUP 子句语法的详细信息,请参见GROUP BY 子句

支持 T-SQL WITH ROLLUP 语法

或者,也可使用 Transact-SQL 兼容语法 WITH ROLLUP 获得与 GROUP BY ROLLUP 相同的结果。不过,该语法稍有不同,只可在此语法中提供简单的 GROUP BY 表达式列表。

以下查询将产生与先前的 GROUP BY ROLLUP 示例相同的结果:

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 ROLLUP
ORDER BY Year, Quarter;