GROUP BY の集計でキー全体の計算結果を含めたい - GROUP BY ROLLUP 演算子の利用 - SQL

GROUP BY の集計でキー全体の計算結果を含める場合のSQLについて紹介します。

概要

GROUP BYを利用すると、レコードの値に応じてグルーピングして集計ができます。特に、複数のキーでグルーピングした場合、片方のキーがすべての場合を含みたい場合や、全体の計算結果を求めたい場合があります。この記事では、GROUP BYを利用した場合であるキーがすべての場合や全体の計算結果を集計に含めるSQLを紹介します。

書式

あるキーがすべての場合を含む場合の集計をする場合には "GROUP BY ROLLUP" 演算子を利用します。
select (列名) from (デーブル名) group by (キー列名) with rollup

テーブル

下記のテーブルを用意します。
ProductsB テーブル
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
2X-XD05ラージデスクオフィステーブル87000
3A-DA40ラウンドダイニングチェアホームチェア28000
4O-XX100ナチュラルオフィスオフィスチェア13800
5R-D400ラウンドダイニングテーブルホームテーブル128000
6R7000ウッドキャビネットオフィスその他32000
7B-200リネンベッドホームベッド184500
8B-250ホワイトダブルベッドホームベッド324850
9W-80ワーキングチェアオフィスチェア45000
10EG-10Xエルゴノミクスデスクオフィステーブル88500

ROLLUPの無い例

下記のSQLを実行します。

SQL文

 select category,class, sum(price) from ProductsB GROUP BY class, category

実行結果

上記のSQLを実行すると下記の結果が戻ります。
categoryclass(列名なし)
その他オフィス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

結果

下記の結果が返ります。
categoryclass(列名なし)
その他オフィス32000
チェアオフィス58800
テーブルオフィス175500
NULLオフィス266300
チェアホーム84000
テーブルホーム128000
ベッドホーム509350
NULLホーム721350
NULLNULL987650
"NULL"が表示されている場所が全体の計算結果となります。"オフィス"全体の金額の合計値、"ホーム"全体の金額の合計値、全体の金額の合計値が計算結果に含まれています。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2017-07-21
iPentec all rights reserverd.