次のようなsales_viewテーブルのデータがあるとします。
PID | Cost | Sale | Margin | State | County | City |
---|---|---|---|---|---|---|
1 | 38350 | 50150 | 11800 | CA | Los Angeles | Long Beach |
1 | 63375 | 82875 | 19500 | CA | San Diego | San Diego |
1 | 46800 | 61200 | 14400 | CA | Los Angeles | Avalon |
2 | 40625 | 53125 | 12500 | CA | Los Angeles | Long Beach |
County ごと、および City ごとの売上げのサマリーを調べるには、次のSELECT文を使用します。
SELECT county, city, sum(margin) FROM sale_view GROUP BY GROUPING SETS ((county),(city));
問合わせにより、次のデータがレポートされます。
County City Sum(margin) ----------- ---------- ----------- Los Angeles ? 38700 San Diego ? 19500 ? Long Beach 24300 ? San Diego 19500 ? Avalon 14400
この例の場合、nullは列のすべての値を表わしていることに注意してください。それは、示されているグループ化セットからこの列が除外されているためです。
基本データがnullの行と、グループ化セットでnullが生成された行を区別するには、GROUPING関数を使用します。
SELECT county, city, sum(margin), GROUPING(county) AS County_Grouping, GROUPING(city) AS City_Grouping FROM sale_view GROUP BY GROUPING SETS ((county),(city));
結果は次のようになります。
County City Sum(margin) County_Grouping City_Grouping ----------- ---------- ----------- --------------- ------------- Los Angeles ? 38700 0 1 San Diego ? 19500 0 1 ? Long Beach 24300 1 0 ? San Diego 19500 1 0 ? Avalon 14400 1 0
拡張グループ化指定が列に対して集約を実行し、その列を特定のグループ化から除外したために結果行に現われたnullを置換するために、GROUPINGを使用することもできます。 例えば、
SELECT CASE WHEN GROUPING(county) = 1 THEN '-All Counties-' ELSE county END AS County, CASE WHEN GROUPING(city) = 1 THEN '-All Cities-' ELSE city END AS City, SUM(margin) FROM sale_view GROUP BY GROUPING SETS (county,city);
問合わせにより、次のデータがレポートされます。
County City Sum(margin) -------------- ------------ ----------- Los Angeles -All Cities- 38700 San Diego -All Cities- 19500 -All Counties- Long Beach 24300 -All Counties- San Diego 19500 -All Counties- Avalon 14400