ポイント
- 異なる条件の集計として、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