GROUP BY

GROUP BYとは

SQLのGROUP BYは、データを特定の列の値でグループ化するために使用されます。GROUP BYを使用することで、レコードのデータをグループにまとめることができます。

GROUP BY カラム1, カラム2, ...

集計で不整合しない

GROUP BYは通常、集計関数(SUM、COUNT、AVGなど)と一緒に使用します。データをグループ化して集計し、結果を返します。

SELECT カラム1, カラム2, ..., 集計関数(カラム1)
FROM テーブル名

集計するカラムは一致させる

集計するためには、SELECTで選択するカラム(カラム1、カラム2...)や集計関数のカラムは、GROUP BYで指定したカラムと不整合が起きないように指定します。

SELECT カラム1, カラム2, 集計関数(カラム1)
FROM テーブル名
GROUP BY カラム1, カラム2

GROUP BYの利用方法

「user_items」テーブルに以下のレコードがあったとします。

id user_id item_id amount total_price
1 1 1 3 900
2 2 1 1 300
3 1 3 2 800
4 3 2 2 700

ユーザごとに集計

「user_items」テーブルのレコードを「user_id」別に集計してみます。

SELECT 
  user_id,
  COUNT(id) AS order_count
  FROM user_items
GROUP BY user_id;

ユーザごとに購入した回数が表示できました。

結果
user_id	order_count
1 2
2 1
3 1
SQL
SELECT
  user_id, 
  COUNT(id) AS order_count, 
  SUM(total_price) AS total_price
FROM user_items
GROUP BY user_id;

ユーザごとに購入した回数と合計金額を集計表示できました。

結果
user_id	order_count total_price
1 2 1700
2 1 300
3 1 700

商品ごとに集計

「user_items」テーブルのレコードを「item_id」別に集計してみます。

SQL
SELECT 
  item_id, 
  COUNT(id) AS order_count, 
  SUM(amount) AS order_amount,
  SUM(total_price) AS total_price
FROM user_items
GROUP BY item_id;

商品ごとに購入された個数が集計して表示できました。

結果
item_id order_count order_amount total_price	
1 2 4 1200
2 1 2 700
3 1 2 800

JOINで処理

JOINで結合する場合、GROUP BYで集計に不整合がなければ、GROUP BYの指定カラム以外もSELECTできます。

SELECT 
  table1.column1, 
  table1.column2, 
  table2.column1,
  table2.column2
  集計関数(table1.column1)
FROM table1
JOIN table2 ON table1.column1 = table2.column1
GROUP BY table1.column1, table1.column2;
  • JOINでは、カラム名が重複しないように「テーブル名.カラム名」で指定するとよいでしょう

ユーザごとに集計

「user_items」と「users」をリレーションして、ユーザ名を表示した例です。

SQL
SELECT
  user_items.user_id, 
  users.name,
  COUNT(user_items.id) AS order_count, 
  SUM(user_Items.amount) AS order_amount,
  SUM(user_items.total_price) AS total_price
FROM user_items
JOIN users ON user_items.user_id = users.id
GROUP BY user_items.user_id;
結果
user_id	name order_count order_amount total_price	
1 三宅 直子 2 5 1700
2 渡辺 直人 1 1 300
3 三宅 聡太郎 2 2 700

商品ごとに集計

「user_items」と「items」をリレーションして、商品名を表示した例です。

SQL
SELECT
  user_items.item_id, 
  items.name,
  COUNT(items.id) AS order_count,
  SUM(user_Items.total_price) AS total_price
FROM user_items
JOIN items ON user_items.item_id = items.id
GROUP BY user_items.item_id;
結果
item_id	name order_count total_price	
1 コーヒー 2 1200
2 紅茶 1 700
3 ほうじ茶 1 800

HAVING

HAVINGとは

HAVINGは、GROUP BYと一緒に使用して、グループ化されたデータに対して条件を適用するためのSQLです。HAVINGで特定の条件を満たすグループのみを結果として取得することができます。

HAVING 条件

HAVINGの基本

GROUP BYの後にHAVINGで条件指定します。条件には集計関数も利用できます。

SELECT カラム1, カラム2, 集計関数(カラム1)
FROM テーブル名
GROUP BY カラム1, カラム2
HAVING 条件

ユーザの購入合計金額を条件指定

合計金額が1000円以上購入したユーザを検索する例です。SUM() で合計金額を計算した結果をHAVINGの条件指定します。

SQL
SELECT
  user_items.user_id, 
  users.name,
  COUNT(user_items.id) AS order_count, 
  SUM(user_Items.amount) AS item_amount,
  SUM(user_items.total_price) AS total_price
FROM user_items
JOIN users ON user_items.user_id = users.id
GROUP BY user_items.user_id
HAVING SUM(user_Items.total_price) >= 1000;

合計金額が1000円以上購入したユーザが表示されました。

結果
user_id name order_count item_amount total_price
1 三宅 直子 2 5 1700

商品の購入合計金額を条件指定

合計金額が1000円以上購入された商品検索する例です。SUM() で合計金額を計算した結果をHAVINGの条件指定します。

SQL
SELECT
  user_items.item_id, 
  items.name,
  COUNT(items.id) AS order_count,
  SUM(user_Items.total_price) AS total_price
FROM user_items
JOIN items ON user_items.item_id = items.id
GROUP BY user_items.item_id
HAVING SUM(user_Items.total_price) >= 1000;

合計金額が1000円以上購入された商品が表示されました。

結果
item_id name order_count total_price
1 コーヒー 2 1200

WHEREの利用

WHEREで条件指定する場合は、GROUP BYの前に記述します。

SELECT 
  table1.column1
FROM table1
JOIN table2 ON table1.column1 = table2.column1
WHERE 条件
GROUP BY table1.column1;

特定の商品を除いた集計

「item_id」が「2」以外で、合計金額が500円以上購入された商品検索する例です。

SQL
SELECT
  user_items.item_id, 
  items.name,
  COUNT(items.id) AS order_count,
  SUM(user_Items.total_price) AS total_price
FROM user_items
JOIN items ON user_items.item_id = items.id
WHERE user_items.item_id != 2
GROUP BY user_items.item_id
HAVING SUM(user_Items.total_price) >= 500;

「item_id」「2」以外の、合計金額が500円以上購入された商品が表示されました。

結果
item_id name order_count total_price
1 コーヒー 2 1200
3 ほうじ茶 1 800