概要:このチュートリアルでは、グループ化セットの概念と、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