ゆる~く覚えるSQL入門:データをグループ化して検索する 複数カラムのグループ化・WHEREとの組み合わせも解説【GROUP BY】

  • 2020年9月23日
  • IT, SQL
  • 3view
IT

今回の記事ではSQLでデータをグループ化する方法を学習します。

グループ化することで日付ごとの売上を検索できたり、商品ごとの売上を検索できたりします。

SQL文入門:パン屋さんの販売履歴テーブル(sales_history)で考えてみよう

テーブル名:sales_history

id name price purchased_day
1 メロンパン 250 2020-09-21
2 カツサンド 400 2020-09-21
3 メロンパン 250 2020-09-22
4 カレーパン 300 2020-09-23
5 メロンパン 250 2020-09-24
6 メロンパン 250 2020-09-24
7 カツサンド 400 2020-09-24

今回は販売履歴(sales_history)テーブルを使って重複を除いて検索する方法を学習しましょう!

【GROUP BY】データをグループ化する

SQLでデータを検索するとき、日付ごとだったり、商品ごとだったり、でグルーピングして検索したいときに使うのがGROUP BYです。

ではさっそく、パン屋さんの販売履歴テーブル(sales_history)から日付ごとの売上を検索してみましょう。

select sum(price), purchased_day
from sales_history
group by purchased_day
;

↓↓↓↓実行すると

・実行結果

sum(price) purchased_day
650 2020-09-21
250 2020-09-22
300 2020-09-23
900 2020-09-24

日付ごとの売上が計算できました。

GROUP BYを使う場合、SELECTで使えるのはGROUP BYで指定しているカラム名と集計関数のみです。

**以下はNG**

select price, purchased_day  ←集計関数を指定していない
from sales_history
group by purchased_day
;

【GROUP BY】複数カラムでグループ化するときは「,(カンマ)」で区切る

GROUP BYは複数カラムでグループ化することも可能です。

その際は、GROUP BY以降「,(カンマ)」で区切ります

では、実際にパン屋さんの販売履歴テーブル(sales_history)から商品名(name)ごと+購入日(purchased_day)ごとの売上データを検索してみましょう。

SQL文は以下のように記載します。

select name, sum(price), purchased_day
from sales_history
group by name, purchased_day
;

↓↓↓↓実行すると

・実行結果

name price purchased_day
メロンパン 250 2020-09-21
カツサンド 400 2020-09-21
メロンパン 250 2020-09-22
カレーパン 300 2020-09-23
メロンパン 500 2020-09-24
カツサンド 400 2020-09-24

日付ごとにどの商品がどれだけの売上なのかを検索できました。

【WHERE】と【GROUP BY】の合わせ技でより細かい検索をする

GROUP BYはWHEREと併用することもでき、その際はWHEREの後にGROUP BYを記載します

では、パン屋さんの販売履歴テーブル(sales_history)から日付ごとの売上が300円以上のデータを検索してみましょう。

select sum(price), purchased_day
from sales_history
where sum(price) >= 300
group by purchased_day
;

↓↓↓↓実行すると

・実行結果

sum(price) purchased_day
650 2020-09-21
300 2020-09-23
900 2020-09-24

日付ごとの売上が300円以上のデータを検索できました。

まとめ

今回の記事をまとめると

  • 特定のカラムをグルーピングしてデータを検索する際はGROUP BYを使う
  • 複数カラムをグルーピングする際はGROUP BYの後カラム名を「,(カンマ)」で区切る
  • GROUP BYとWHERE両方を使う場合は、WHEREの後にGROUP BYを記載する
最新情報をチェックしよう!