メインコンテンツへスキップ

GROUPING

ROLLUPCUBE は、GROUP BY の修飾子です。どちらも小計を計算します。ROLLUP は、たとえば (day, month, year) のような順序付きのカラムのリストを取り、集約の各レベルの小計を計算したうえで、最後に総計も計算します。CUBE は、指定したカラムのすべての組み合わせに対する小計を計算します。GROUPING は、ROLLUP または CUBE が返す行のうち、どれが上位集約の行で、どれが修飾子なしの GROUP BY で返される行かを識別します。 GROUPING 関数は複数のカラムを引数に取り、ビットマスクを返します。
  • 1 は、GROUP BY に対する ROLLUP または CUBE 修飾子によって返された行が小計であることを示します
  • 0 は、ROLLUP または CUBE によって返された行が小計ではないことを示します

GROUPING SETS

デフォルトでは、CUBE 修飾子は、CUBE に渡されたカラムのすべての組み合わせについて小計を計算します。GROUPING SETS を使うと、計算する組み合わせを個別に指定できます。 階層データの分析は、ROLLUP、CUBE、GROUPING SETS 修飾子の代表的なユースケースです。ここでのサンプルは、2 つのデータセンター全体で、どの Linux ディストリビューションとそのバージョンがインストールされているかに関するデータを含むテーブルです。このデータは、ディストリビューション、バージョン、ロケーションごとに見ると役立ちます。

サンプルデータを読み込む

シンプルなクエリ

各データセンターのサーバー数をディストリビューション別に取得します:

複数のGROUP BYステートメントをGROUPING SETSと比較する

CUBE、ROLLUP、GROUPING SETSを使わずにデータを集計すると:
GROUPING SETSを使用して同じ情報を取得するには:

CUBE と GROUPING SETS の比較

次のクエリの CUBE(datacenter,distro,version) における CUBE は、必ずしも妥当な階層になるとは限りません。2 つのディストリビューションをまたいで バージョン を比較しても意味はありません (Arch と RHEL ではリリースサイクルもバージョンの命名規則も異なるためです) 。この次に続く GROUPING SETS の例のほうが適切で、distroversion を同じセットとしてグループ化しています。
上の例の バージョン は、ディストリビューションに関連付けられていない場合、意味をなさない可能性があります。カーネルバージョンを追跡しているのであれば意味があるかもしれません。というのも、カーネルバージョンはどちらのディストリビューションにも対応しうるためです。次の例のように、GROUPING SETS を使用するほうが適切かもしれません。
最終更新日 2026年7月2日