Collection Contents 上一页 下一页 PDF

ASA SQL 用户指南

使用 OLAP

使用 ROLLUP


ROLLUP 操作提供集合行的小计。它使用 GROUP BY 子句在查询的结果集中添加小计行。ROLLUP 会生成一个结果集,显示所选列中的值的层次的集合。如果希望结果集显示总计和小计,请使用 ROLLUP 操作。

此 SQL 语法... 定义以下集合...
GROUP BY ROLLUP (A, B, C);
(A, B, C)

(A, B)

(A)

( )

有关 ROLLUP 查询返回的行的详细信息,请参见关于 OLAP 操作。有关在查询中使用 GROUP BY 子句的详细信息,请参见 GROUP BY 子句

示例 1 

在下面的示例中,查询返回按年和季度汇总销售订单数的数据。

SELECT year (order_date) AS Year, quarter (order_date) AS Quarter, COUNT (*) AS Orders
FROM sales_order
GROUP BY ROLLUP (Year, Quarter)
ORDER BY Year, Quarter

下面的表是查询的结果集。在结果集中突出显示小计行。每一小计行在计算小计的列中的值为 NULL。

A result set from a ROLLUP query identifying the subtotalled rows.

标有 [1] 的行表示两年(2000、2001)和所有季度的订单总数。该行在 Year 列和 Quarter 列中的值均为 NULL,是所有列均未包括在前缀中的行。

注意 
每个 ROLLUP 操作均返回的结果集中均具有这样一行:除集合列外,每个列中均显示 NULL。该行表示对执行集合函数的每一列的汇总。例如,如果 SUM 是正在讨论的集合函数,则该行将表示所有值的总数之和。

突出显示行 [2] 的行分别表示 2000 年和 2001 年的订单总数。这两个行的 Quarter 列中均为 NULL,因为该列中的值会累计,为 Year 提供小计。

注意 
结果集中这种行的数目取决于 ROLLUP 查询中出现的变量数。

标有 [3] 的其余行通过提供两年内每个季度的订单总数提供了摘要信息。

示例 2 

下面是 ROLLUP 操作的另一个示例,与第一个示例相比,它返回的结果集略微复杂一些。结果集按年、季度和区域汇总了销售订单数。在此示例中,只检查第一和第二季度和两个选定区域(加拿大和东部地区)。

SELECT year (order_date) AS Year, quarter (order_date) AS Quarter, region, COUNT (*) AS Orders
FROM sales_order
WHERE region IN ('Canada', 'Eastern') AND quarter IN ('1', '2')
GROUP BY ROLLUP (Year, Quarter, Region)
ORDER BY Year, Quarter, Region

下面的表是查询的结果集。每一小计行在计算小计的列中的值为 NULL。

A result from a ROLLUP query showing the total number of sales orders over all years, quarters, and regions, and the subtotals of sales orders by year.

第一行 [1] 是所有行的集合,在 Year、Quarter 和 Region 列中为 NULL。该行的 Orders 列中的值表示 2000 年和 2001 年的第 1 和第 2 季度在加拿大和东部地区的订单总数。

标有 [2] 的行表示每年(2000 年 和 2001 年)的第 1 和第 2 季度在加拿大和东部地区的销售订单总数。这些行 [2] 的值等于行 [1] 中呈现的总数。

标有 [3] 的行按区域提供有关给定年份和季度的订单总数的数据。

A result set from a ROLLUP query showing the total number of orders for each year by quarter and region.

标有 [4] 的行在结果集中提供了有关每年、每季度和每个区域的订单总数的数据。

A result set from a ROLLUP query showing the number of orders for each year, each quarter, and each region.
了解 ROLLUP 和小计行 

ROLLUP 等效于一组 GROUP BY 查询的 UNION。以下查询的结果集是相同的。GROUP BY A, B 的结果集包括所有那些 A 和 B 保持不变的行的小计。要实现联合,可为列 C 指派 NULL。

此 ROLLUP 查询... 等效于没有 ROLLUP 的此查询...
SELECT A, B, C, 
     SUM( D )
FROM T1
GROUP BY ROLLUP 
     (A, B, C);
SELECT * FROM (
 ( SELECT A, B, C, SUM( D )
   GROUP BY A, B, C )
  UNION ALL
 ( SELECT A, B, NULL, SUM( D )
   GROUP BY A, B )
  UNION ALL
 ( SELECT A, NULL, NULL, SUM( D )
   GROUP BY A )
  UNION ALL
 ( SELECT NULL, NULL, NULL, SUM( D ) )
)

Collection Contents 上一页 下一页 PDF