概要:このチュートリアルでは、グループ化セットの概念と、PostgreSQL GROUPING SETS句を使って問い合わせの中に複数のグループ化セットを生成する方法について学習します。
サンプルテーブルを設定する
さっそく、デモ用にsalesという新しいテーブルを作成しましょう。
Code language: SQL (Structured Query Language) (sql)

salesテーブルにはブランドとセグメント別に販売された商品数が格納されます。
Introduction to PostgreSQL GROUPING SETS
グループ化セットは、GROUP BY句を使用してグループ化する列のセットです。
グループ化セットは、括弧の中に置かれたカンマ区切りの列のリストで示されます:
例えば、次のクエリはGROUP BY節を使ってブランドとセグメントごとの製品数を返しています。 言い換えると、これは、(brand, segement)
Code language: SQL (Structured Query Language) (sql)

で示されるブランドとセグメントのグループ化セットを定義しています。 これは、グループ化セット(brand):
Code language: SQL (Structured Query Language) (sql)

次のクエリは、セグメント別に販売されている製品の数を検索します。 これは、グループ化セット (segment):
Code language: SQL (Structured Query Language) (sql)

次のクエリは、すべてのブランドとセグメントについて販売された製品数を検索します。 これは、().
Code language: SQL (Structured Query Language) (sql)

で示される空のグループ化セットを定義します。単一のクエリを使用して、すべてのグループ化セットを使用する場合を考えてみましょう。 これを実現するには、UNION ALL を使用して上記のすべてのクエリを結合します。
UNION ALLでは、すべての結果セットに互換性のあるデータ型を持つ同じ数の列が必要なため、次のようにそれぞれの選択リストに NULL を追加してクエリを調整する必要があります:
Code language: SQL (Structured Query Language) (sql)
このクエリは、すべてのグルーピング セットに対する集約で単一の結果セットを生成しました。
- 第一に、かなり長くなります。
- 第二に、PostgreSQL は各クエリに対して
salesテーブルを個別にスキャンしなければならないため、パフォーマンスの問題があります。
より効率的にするために、PostgreSQLはGROUP BY句の下位句であるGROUPING SETS句を提供します。
GROUPING SETSの一般的な構文は次のとおりです。
Code language: SQL (Structured Query Language) (sql)
この構文では、4つのグループ化セット(c1,c2)、(c1)、(c2)、および()を使用します。
この構文を上記の例に適用するには、次のようにUNION ALL句の代わりにGROUPING SETS句を使用します:
Code language: SQL (Structured Query Language) (sql)

このクエリーははるかに短く、読みやすくなっています。 さらに、PostgreSQLはsalesテーブルをスキャンする回数を最適化し、複数回スキャンすることはありません。
グループ化関数
GROUPING()関数は、列名または式からなる引数を受け付けます。
GROUPING()関数は、引数が現在のグループ化セットのメンバーである場合はビット0を、そうでない場合は1を返します。
次の例を参照してください。
Code language: SQL (Structured Query Language) (sql)

スクリーンショットに示すように、grouping_brandの値が0のとき、sum列はbrandの小計を示します。
grouping_segmentの値が0 のとき、segmentの小計を示す合計列が表示されます。
このように、HAVING句のGROUPING()関数を使用して、各ブランドの小計を求めることができます。

このチュートリアルでは、PostgreSQL GROUPING SETSを使って複数のグループ化セットを生成する方法について学習しました。
- このチュートリアルは役に立ちましたか?
- YesNo