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

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

 

使用 GROUPING 函数检测占位符 NULL

ROLLUP 和 CUBE 创建的总计行和小计行在未用于分组的 SELECT 列表中指定的任意列中均含有占位符 NULL。这意味着,您在检查结果时,将无法区分小计行中的 NULL 是占位符 NULL 还是计算行的底层数据时所得的 NULL。结果,同样很难区分详细信息行、小计行和总计行。

通过 GROUPING 函数可将占位符 NULL 与底层数据产生的 NULL 区分开来。如果通过分组集说明中的一个 group-by-expression 指定 GROUPING 函数,则在结果为占位符 NULL 时该函数将返回 1,而在结果反映该行底层数据中的某个值(或许为 NULL)时返回 0。

例如,以下查询将返回下表中所示的结果集:



SELECT Employees.EmployeeID AS Employee,
   YEAR( OrderDate ) AS Year,
   COUNT( SalesOrders.ID ) AS Orders,
   GROUPING( Employee ) AS GE,
   GROUPING( Year ) AS GY
FROM Employees LEFT OUTER JOIN SalesOrders
   ON Employees.EmployeeID = SalesOrders.SalesRepresentative
WHERE Employees.Sex IN ( 'F' )
   AND Employees.State IN ( 'TX' , 'NY' )
GROUP BY GROUPING SETS ( ( Year, Employee ), ( Year ), ( ) )
ORDER BY Year, Employee;

此查询会返回以下结果:

Employees Year Orders GE GY
1 (NULL) (NULL) 54 1 1
2 (NULL) (NULL) 0 1 0
3 102 (NULL) 0 0 0
4 390 (NULL) 0 0 0
5 1062 (NULL) 0 0 0
6 1090 (NULL) 0 0 0
7 1507 (NULL) 0 0 0
8 (NULL) 2000 34 1 0
9 667 2000 34 0 0
10 (NULL) 2001 20 1 0
11 667 2001 20 0 0

在本例中,因为指定了空分组集 '()',所以第 1 行表示订单数总计 (54)。请注意,GE 和 GY 均含有 1,这表明雇员 (Employees) 和年份 (Year) 列中的 NULL 分别为雇员 (Employees) 和年份 (Year) 列的占位符 NULL。

第 2 行为小计行。GE 列中的 1 表示雇员 (Employees) 列中的 NULL 是占位符 NULL。GY 列中的 0 表示年份 (Year) 列中的 NULL 为计算底层数据所产生的结果,而不是占位符 NULL;这时,此行表示没有订单的雇员。

第 3-7 行显示了年份 (Year) 列为 NULL 时每位雇员的订单总数。即,这些行是居住在德克萨斯和纽约且没有订单的女雇员。这些行是第 2 行的详细信息行。即,第 2 行为第 3-7 行的总计。

第 8 行为显示 2000 年中所有雇员的订单数的小计行。第 9 行为第 8 行的详细信息单行。

第 10 行为显示 2001 年中所有雇员的订单数的小计行。第 11 行为第 10 行的详细信息单行。

有关 GROUPING 函数的语法的详细信息,请参见GROUPING 函数 [Aggregate]