データをグループ化する(GROUP BY句)
GROUP BY 句を使用すると指定したカラムの値を基準にデータをグループ化することができます。グループ化することでデータの数を数える COUNT 関数やデータの平均を計算する AVG 関数をグループ毎に行うことができます。ここでは MySQL で GROUP BY 句を使ってデータをグループ化する方法について解説します。
(Last modified: )
データをグループ化する
GROUP BY 句を使用することで SELECT 文でデータを取得する時に指定したカラム名の値を基準にグループ化することができます。次のように使います。
SELECT col_name1 [, col_name2 ...] FROM table_name GROUP BY col_name, ...
GROUP BY 句の後に指定したカラム名の値が同じデータをグループとしてまとめます。複数のカラム名を指定した場合には、カラムの値の組み合わせが同じデータをグループとしてまとめます。
グループ化するとSELECT文で取得できるデータの数はグループの数だけとなります。そこでグループ化を行った場合には、グループ化に指定したカラムの値や、用意された関数を使ってカラムの値をグループ単位で集計した結果などを取得することができます。
-- --
それでは実際に試してみます。次のようなテーブルを作成しました。
create table report (name varchar(10), color varchar(10), sales int);
テーブルには次のようなデータを追加してあります。
insert into report values ('Bag', 'Black', 4500);
insert into report values ('Wallet', 'White', 3800);
insert into report values ('Bag', 'Red', 5100);
insert into report values ('Bag', 'Black', 4600);
insert into report values ('Wallet', 'Black', 3900);
insert into report values ('Wallet', 'White', 4000);
insert into report values ('Bag', 'Red', 5200);
それでは name カラムの値を基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得します。
select name, sum(sales) from report group by name;
これは次のように計算された結果です。テーブルに格納されたデータを name カラムの値でグループに分け、グループ毎に sales カラムの値を合計を計算しています。
Bag Black 4500 Bag Red 5100 Bag Black 4600 Bag Red 5200 -------------------- 19400 Bag グループの集計結果 Wallet White 3800 Wallet Black 3900 Wallet White 4000 --------------------- 11700 Wallet グループの集計結果
次に name カラムと color カラムの組み合わせを基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得します。
select name, color, sum(sales) from report group by name, color;
これは次のように計算された結果です。
Bag Black 4500 Bag Black 4600 -------------------- 9100 Bag/Black グループの集計結果 Bag Red 5100 Bag Red 5200 -------------------- 10300 Bag/Red グループの集計結果 Wallet White 3800 Wallet White 4000 --------------------- 7800 Wallet/White グループの集計結果 Wallet Black 3900 --------------------- 3900 Wallet/Black グループの集計結果
※ SUM 関数はカラムに格納されている値の合計を取得する関数です。詳細は「SUM関数 (指定したカラムに格納されている値の合計を取得する)」を参照されてください。
グループ化したデータを集約したデータを取得する(WITH ROLLUP)
例えばグループ毎に集計を取ったデータを取得する場合、グループ毎の集計した値は取得できますが、集計した値をさらに集計した値は取得することができません。グループ毎に集計した値をさらに集計した結果もあわせて取得するには WITH ROLLUP を指定します。
SELECT col_name1 [, col_name2 ...] FROM table_name
GROUP BY col_name, ... WITH ROLLUP
それでは先ほど作成したテーブルを利用して試してみます。
name カラムの値を基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得すると次のようなデータを取得することができました。
select name, sum(sales) from report group by name;
ここで WITH ROLLUP を付けると。グループ毎に集計したデータをさらに集計したデータを取得することができます。
select name, sum(sales) from report group by name with rollup;
全グループのデータを集約した値を最後に取得しています。最後のデータは name カラムの値が NULL となります。
-- --
もう一つ試してみます。 name カラムの値と color カラムの値の組み合わせを基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得すると次のようなデータを取得することができました。
select name, color, sum(sales) from report group by name, color;
ここで WITH ROLLUP を付けると。グループ毎に集計したデータをさらに集計したデータを取得することができます。
select name, color, sum(sales) from report group by name, color with rollup;
今回の場合、まず name カラム毎に集計したデータを自動で取得し、最後に全グループを集約したデータを自動で取得します。
-- --
GROUP BY 句を使ってデータをグループ化する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。