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 行的详细信息单行。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |