- カテゴリ:
GROUP BY ROLLUP¶
GROUP BY ROLLUPは GROUP BY 句の拡張機能であり、(詳細なグループ化された行に加えて)階層の複数のレベルで集計された行を生成します。たとえば、都市と州ごとにグループ化した場合、ROLLUPは各都市と州の組み合わせ、各州の合計、およびすべての州の総合計を生成します。これらの集計は、SELECT句で指定されているのと同じ集計関数を使用して計算されます。
ROLLUPは他のGROUP BY式と組み合わせることができます。たとえば、 GROUP BY x, ROLLUP(y, z) と記述し、列 x でグループ化すると共に y および z に対するロールアップ集約を組み合わせることができます。
ロールアップは、複数の結果セットを生成するものと考えることができます。各結果セット(最初の結果セット)は、前の結果セットの集合です。例えば、小売店のチェーンを所有している場合、次の利益を確認できます。
各店舗。
各都市(大都市には複数の店舗がある場合があります)。
各州。
すべて(すべての州のすべての店舗)。
別のレポートを作成してその情報を取得することもできますが、データを1回スキャンする方が効率的です。
グループ化セット の概念に精通している場合、ROLLUPグループ化は一連のグループ化セットと同等であると考えることができますが、本質的に仕様が短くなります。N 仕様の ROLLUP 要素は N+1 GROUPING SETS に対応しています。
こちらもご参照ください¶
GROUPING (各行を生成したグループ化レベルを識別するユーティリティ関数)
構文¶
条件:
パラメーター¶
使用上の注意¶
クエリはより高いレベルで集約されるため、各行のより多くの列に NULL 値が表示されます。これは適切です。次の例では、州レベルの集計の場合
city列はNULLです。これは、profit列の値が1つの都市に対応していないからです。同様に、すべての州とすべての都市のデータを集計する最終合計では、収益は特定の州または特定の都市からのものではないため、その行のstateとcityの列は両方ともNULLです。クエリは、 ROLLUP の後の括弧内で最初に「最上位レベル」をリストする必要があります。たとえば、州には都市が含まれているため、州と都市間でデータをロールアップする場合、句は
GROUP BY ROLLUP (state, city)である必要があります。列名の順序を逆にすると、期待したものとは異なる結果になる可能性が高くなります。以下の例で、ROLLUP句にある
cityとstateの順序を逆にした場合、カリフォルニアとプエルトリコの両方にサンノゼ(SJ)という名前の都市があるため、結果は少なくとも部分的には不正確になります。収益すべての最終合計での場合を除き、サンノゼという2つの都市の収益を結合するのは望ましくありません。(同じ名前の異なる都市のデータを組み合わせないようにする別の方法は、都市ごとに一意の ID を作成し、クエリで名前ではなく ID を使用することです。)GROUPING ユーティリティ関数は、ロールアップ集計から得られるNULL値とデータの実際のNULL値の区別に役立ちます。GROUPINGは、指定された列のグループ化された行について
0を返し、集約によって列がNULLになっている行について1を返します。
例¶
さまざまな都市や州/準州に支店を持つチェーンストアでの販売に関する情報を含むテーブルを作成して読み込むことから始めます。
都市、州、およびすべての州の合計別に利益を示すロールアップクエリを実行します。クエリは、3つの「レベル」の集約を生成します。
各都市。
各州。
すべての州を集約したすべての収益。
このクエリでは、 ORDER BY state, city NULLS LAST を使用して、各州のロールアップがその州内の都市すべてで直後にくるようにし、最終的なロールアップが出力の最後に表示されるようにします。
一部のロールアップ行には NULL 値が含まれています。たとえば、テーブルの最後の行には、都市の NULL 値と州の NULL 値が含まれています。これは、データが特定の都市と州ではなく、すべての都市と州に関するものだからです。