GROUP BY の集計でキー全体の計算結果を含めたい - GROUP BY ROLLUP 演算子の利用 - SQL
GROUP BY の集計でキー全体の計算結果を含める場合のSQLについて紹介します。
概要
GROUP BYを利用すると、レコードの値に応じてグルーピングして集計ができます。特に、複数のキーでグルーピングした場合、片方のキーがすべての場合を含みたい場合や、全体の計算結果を求めたい場合があります。この記事では、GROUP BYを利用した場合であるキーがすべての場合や全体の計算結果を集計に含めるSQLを紹介します。
書式
あるキーがすべての場合を含む場合の集計をする場合には "GROUP BY ROLLUP" 演算子を利用します。
select (列名) from (デーブル名) group by (キー列名) with rollup
例
テーブル
下記のテーブルを用意します。
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 |
ROLLUPの無い例
下記のSQLを実行します。
SQL文
select category,class, sum(price) from ProductsB GROUP BY class, category
実行結果
上記のSQLを実行すると下記の結果が戻ります。
category | class | (列名なし) |
その他 | オフィス | 32000 |
チェア | オフィス | 58800 |
チェア | ホーム | 84000 |
テーブル | オフィス | 175500 |
テーブル | ホーム | 128000 |
ベッド | ホーム | 509350 |
classとcategory の値でそれぞれの商品の金額の合計が計算されています。ただし、classで"オフィス"全体の金額の合計値や"ホーム"全体の合計値は計算されていません。
ROLLUPの例
先の結果に、classで"オフィス"全体の金額の合計値や"ホーム"全体の合計値を計算結果に含める場合には、下記のSQLを実行します。
SQL文
select category,class, sum(price) from ProductsB GROUP BY class, category with ROLLUP
結果
下記の結果が返ります。
category | class | (列名なし) |
その他 | オフィス | 32000 |
チェア | オフィス | 58800 |
テーブル | オフィス | 175500 |
NULL | オフィス | 266300 |
チェア | ホーム | 84000 |
テーブル | ホーム | 128000 |
ベッド | ホーム | 509350 |
NULL | ホーム | 721350 |
NULL | NULL | 987650 |
"NULL"が表示されている場所が全体の計算結果となります。"オフィス"全体の金額の合計値、"ホーム"全体の金額の合計値、全体の金額の合計値が計算結果に含まれています。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。