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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » データの問い合わせと修正 » OLAP のサポート » GROUPING SETS のショートカットとしての ROLLUP と CUBE

 

GROUPING 関数を使用した NULL の検出

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 の単一ディテールローです。

 参照