LoginSignup
1
0

More than 1 year has passed since last update.

SQLのCASE式を使って異なる条件の集計を1つのSQLで行うテクニック

Last updated at Posted at 2021-07-26

ポイント

  • 異なる条件の集計として、CASE式はよく用いられるらしい
    • 例えば、以下のリンクような都道府県テーブルと、市区町村テーブルがあり
      • そのに店舗テーブル(仮にshopsとする)をJOINさせたとする

都道府県や市区町村ごとではなく地方ごとに集計したい場合

name 件数 shop.idが1000以下のデータ件数 shop.idが1000より高いデータ件数
三重県 12 0 12
京都府 34 0 34
佐賀県 24 0 24
兵庫県 8 0 8
北海道 61 10 51

...

こんなデータを出したいとします。 case式が役に立ちます

shop.idが1000以下と以上で比較したいケースなんてないだろう。。。

そんな方は、例えばエリアごと人口で女性男性別に集計するイメージを持ってほしいです。

実例

SELECT
    p.name,
    count(s.id) AS '件数',
    COUNT(CASE WHEN s.id <= 1000 THEN s.id ELSE NULL END) AS 'idが1000以下のデータ件数',
    COUNT(CASE WHEN s.id > 1000 THEN s.id ELSE NULL END) AS 'idが1000より高いデータ件数'
FROM prefectures AS p

-- 色んなテーブルを紐づけていく --
LEFT JOIN cities AS c ON c.prefecture_id = p.id
LEFT JOIN shops AS s ON s.city_id = c.id

-- グループ化
GROUP BY p.name

ポイント

  • SQLのUNIONとかせずに済む
  • CASE式の方が1回のSQLで済む
  • クロス表形式で結果が出力されるので、非エンジニアにデータだけcvsエクスポートして渡すときを考えると
    • 分析者が容易に分析できるシートになっている
      • なぜなら、カテゴリを列で持たせたから

参照

8-11p

アウトプット100本ノック実施中

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0