Developer

【SQL基礎】ROLLUPを使ってみる
2021.08.31
Lv1

【SQL基礎】ROLLUPを使ってみる

本項からはGROUPING演算子を実際に使用して解説していきます。


ROLLUPを使ってみる

今回は、以下のテーブルを使用してROLLUPの動きを見ていきます。

まずは比較の為、GROUP BYで商品ごとの合計金額を表示してみましょう。

SELECT name, sum(price)
FROM sales
GROUP BY name;

ここにROLLUPを使用すると以下のように全体の合計金額の行(超集合行)が追加されます。

SELECT name, sum(price)
FROM sales
GROUP BY name WITH ROLLUP;

一番最後に全体の合計金額が追加されたことが確認できたかと思います。
超集合行では、表示する値が不明な列ができてしまうので、その部分はNULLが表示されます。

また、GROUP BY句で複数の列を指定した場合は、もう少し複雑な処理となります。
まずは、同じようにGROUP BYのみで見てみましょう。

SELECT name, date, sum(price)
FROM sales 
GROUP BY name, date;

同じように、ROLLUPを使用すると以下のようになります。

SELECT name, date, sum(price)
FROM sales 
GROUP BY name, date WITH ROLLUP;

最終行の全体の合計だけでなく、商品ごとの小計金額も追加されていることが確認できます。
このように、GROUP BYで指定する列が増えるごとに追加される小計の列が増えていきます。
例えば、col1、col2、col3としていた場合は、col1とcol2の小計、col1の小計といった具合に、指定した列の右側から一つずつ除外していった組み合わせの小計が追加されます。


今回の学習ポイント

・超集合行では、集約された列はNULL表記になる
・GROUP BYで複数列を指定すると全体合計以外にも各小計行も追加される


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.ROLLUPを使用して、ゴール情報テーブル(goals_tmp)のデータで、ワールドカップ全体の合計得点と各選手(playser_name)の対戦国(enemy_country)ごとの得点数と全試合の合計得点数を表示してください。

答え
[sql] SELECT player_name, enemy_country, count(*)
FROM goals_tmp
GROUP BY player_name, enemy_country WITH ROLLUP;
[/sql]

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ