GROUP BY の集計でキー全体の計算結果を含めてすべての組み合わせを計算する場合のSQLについて紹介します。
概要
GROUP BYを利用すると、レコードの値に応じてグルーピングして集計ができます。また、複数のキーでグルーピングした場合、片方のキーがすべての場合を含みたい場合や、全体の計算結果を求めたい場合は、GROUP BY ROLLUP を利用した計算できます。GROUP BY ROLLUPでは選択した列の値の階層の集計を示す結果になるため、すべての組み合わせを計算しません。この記事ではすべての組み合わせで計算するSQLを紹介します。
書式
すべての組み合わせを計算して集計する場合には "GROUP BY CUBE" 演算子を利用します。
select (列名) from (デーブル名) group by (キー列名) with cube
例
テーブル
下記のテーブルを用意します。
ProductsB テーブル
id | model | name | class | category | price |
1 | C-XM01 | モーダンチェア | ホーム | チェア | 56000 |
2 | X-XD05 | ラージデスク | オフィス | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | ホーム | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | オフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | ホーム | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | オフィス | その他 | 32000 |
7 | B-200 | リネンベッド | ホーム | ベッド | 184500 |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
9 | W-80 | ワーキングチェア | オフィス | チェア | 45000 |
10 | EG-10X | エルゴノミクスデスク | オフィス | テーブル | 88500 |
GROUP BY CUBEの例
すべての組み合わせの合計値を計算結果に含める場合には、下記のSQLを実行します。
SQL文
select category,class, sum(price) from ProductsB GROUP BY class, category with cube
結果
下記の結果が返ります。
category | class | (列名なし) |
その他 | オフィス | 32000 |
その他 | NULL | 32000 |
チェア | オフィス | 58800 |
チェア | ホーム | 84000 |
チェア | NULL | 142800 |
テーブル | オフィス | 175500 |
テーブル | ホーム | 128000 |
テーブル | NULL | 303500 |
ベッド | ホーム | 509350 |
ベッド | NULL | 509350 |
NULL | NULL | 987650 |
NULL | オフィス | 266300 |
NULL | ホーム | 721350 |
"NULL"が表示されている場所が全体の計算結果となります。classの"オフィス"全体の金額の合計値、"ホーム"全体の金額の合計値、に加え、、Categoryの"チェア" "テーブル" "ベッド" "その他"の合計値と、全体の金額の合計値が計算結果に含まれています。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-03-26
作成日: 2017-07-22