GROUP BY の集計でキー全体の計算結果を含めてすべての組み合わせを計算する場合のSQLについて紹介します。
GROUP BYを利用すると、レコードの値に応じてグルーピングして集計ができます。また、複数のキーでグルーピングした場合、片方のキーがすべての場合を含みたい場合や、全体の計算結果を求めたい場合は、GROUP BY ROLLUP を利用した計算できます。GROUP BY ROLLUPでは選択した列の値の階層の集計を示す結果になるため、すべての組み合わせを計算しません。この記事ではすべての組み合わせで計算するSQLを紹介します。
すべての組み合わせを計算して集計する場合には "GROUP BY CUBE" 演算子を利用します。
下記のテーブルを用意します。
| 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 |
すべての組み合わせの合計値を計算結果に含める場合には、下記の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の"チェア" "テーブル" "ベッド" "その他"の合計値と、全体の金額の合計値が計算結果に含まれています。