データをグループ化する(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);

データをグループ化する(1)

テーブルには次のようなデータを追加してあります。

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);

データをグループ化する(2)

それでは name カラムの値を基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得します。

select name, sum(sales) from report group by name;

データをグループ化する(3)

これは次のように計算された結果です。テーブルに格納されたデータを 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;

データをグループ化する(4)

これは次のように計算された結果です。

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;

グループ化したデータを集約したデータを取得する(1)

ここで WITH ROLLUP を付けると。グループ毎に集計したデータをさらに集計したデータを取得することができます。

select name, sum(sales) from report group by name with rollup;

グループ化したデータを集約したデータを取得する(2)

全グループのデータを集約した値を最後に取得しています。最後のデータは name カラムの値が NULL となります。

-- --

もう一つ試してみます。 name カラムの値と color カラムの値の組み合わせを基準としてグループ化を行い、グループ毎に sales カラムの値を集計して取得すると次のようなデータを取得することができました。

select name, color, sum(sales) from report group by name, color;

グループ化したデータを集約したデータを取得する(3)

ここで WITH ROLLUP を付けると。グループ毎に集計したデータをさらに集計したデータを取得することができます。

select name, color, sum(sales) from report group by name, color with rollup;

グループ化したデータを集約したデータを取得する(4)

今回の場合、まず name カラム毎に集計したデータを自動で取得し、最後に全グループを集約したデータを自動で取得します。

-- --

GROUP BY 句を使ってデータをグループ化する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。