ROLLUP と CUBE で作成される合計や小計のローには、グループ化で使用されなかった SELECT リストで指定したあらゆるカラムに、プレースホルダの NULL が含まれます。結果を検査しているときは、小計のローにある NULL がプレースホルダの NULL なのか、それともローの基本になるデータの評価による NULL なのかを区別できません。その結果、ディテールロー、小計ロー、総合計ローを区別することも困難になります。
GROUPING 機能を使用すると、プレースホルダの NULL を基本となるデータによる NULL と区別できます。グループ化セット指定から group-by-expression を 1 つ使用して 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 である注文の合計数を示しています。つまり、これらは注文のない Texas と New York に住む女性従業員のものです。これらのローはロー 2 のディテールローです。つまり、ロー 2 はロー 3 ~ 7 の合計です。
ロー 8 は、2000 年のすべての従業員の分を合わせた注文数を示す小計ローです。ロー 9 は、ロー 8 の単一ディテールローです。
ロー 10 は、2001 年のすべての従業員の分を合わせた注文数を示す小計ローです。ロー 11 は、ロー 10 の単一ディテールローです。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |