データをグループ化する(GROUP BY句)

広告
eyecatch

GROUP BY 句を使用すると指定したカラムの値を基準にデータをグループ化することができます。グループ化することでデータの数を数える COUNT 関数やデータの平均を計算する AVG 関数をグループ毎に行うことができます。ここでは GROUP BY 句を使ってデータをグループ化する方法について解説します。

データをグループ化する

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 句を使ってデータをグループ化する方法について解説しました。

MySQLの使い方の他の記事を見てみる

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。