SQL 複数の行をまとめる(集約関数/group by/having)

SQLの複数の行をまとめるサンプルです。
集約関数とgroup by句とhaving句を使用します。

目次

集約関数

集約関数は、複数の行をまとめて1つの列の平均や合計などの計算結果を返します。

主な集約関数
集約関数 説明
AVG() 平均を返す
SUM() 合計を返す
MAX() 最大値を返す
MIN() 最小値を返す
COUNT() 個数を返す

テストデータ

次のテーブルがあるとします。

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

SQL文

上記テーブルに対して集約関数を使用してデータを抽出します。
1行目は、それぞれ集約関数を使用しています。

SELECT SUM(price),AVG(price),MAX(price),MIN(price),COUNT(price) 
FROM `syouhin`;

 

結果は、複数の行が1行になり集約関数の値が表示されます。

SUM(price) AVG(price) MAX(price) MIN(price) COUNT(price)
1000 250.0000 500 100 4

 

複数の行をグループごとにまとめる(group by)

select 項目 from テーブル名 group by 項目

group by句を使用すると、複数の行をグループごとにまとめることができます。

テストデータ

次のテーブルがあるとします。

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

SQL文

上記テーブルに対してgroup by句を使用してデータを抽出します。

3行目は、group by句を指定しています。

SELECT category,AVG(price) 
FROM `syouhin` 
group by category;

 

結果は、group by句で指定した項目「category」の値でまとめられた行が表示されます。
また、その行ごとに集約関数の値が表示されます。

syouhin
category AVG(price)
野菜 150.0000
350.0000

 

複数の行をグループごとにまとめ、集約関数の値に条件を指定する(having)

select 項目 from テーブル名 group by 項目 having 条件

having句を使用すると、複数の行をグループごとにまとめた列の項目の集約関数の値に条件を指定することができます。

テストデータ

次のテーブルがあるとします。

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

SQL文

上記テーブルに対してhaving句を使用してデータを抽出します。

4行目は、having句を指定しています。

SELECT category,AVG(price) 
FROM `syouhin` 
group by category 
having AVG(price) > 200;

 

結果は、まずgroup by句で指定した項目「category」の単位でまとめらます。

syouhin
category AVG(price)
野菜 150.0000
350.0000

次に、AVG(price)の列に対してhaving句で指定した条件(200より大きい)を満たす行が表示されます。

syouhin
category AVG(price)
350.0000

where句を使用した場合

以下のように、where句で、集約関数(AVG)の結果を条件にすることはできません。

SELECT category,AVG(price) 
FROM `syouhin` 
where AVG(price) > 200
group by category;

MySQLでは、以下のメッセージが表示されます。
#1111 - 集計関数の使用方法が不正です。

集約関数の結果を条件にする場合は、having句を使用します。

リンク

以下は、MySQLのGROUP BY 修飾子のリンクです。
https://dev.mysql.com/doc/refman/5.6/ja/group-by-modifiers.html

関連の記事

SQL INSERT文のサンプル
SQL UPDATE文とDELETE文のサンプル
SQL 重複行を表示しないサンプル(distinct)
SQL 外部結合のサンプル(left outer join/right outer join)
SQL 副問合せのサンプル(サブクエリ)
SQL 自己結合のサンプル
SQL 内部結合のサンプル(inner join)
SQL UNIONのサンプル

△上に戻る