#やりたいこと
カラムごとに条件を変えたSELECT文を書きたい。
SELECT (出力データ)
FROM (テーブル)
WHERE (出力条件)
GROUP BY (指定カラム)
ORDER BY (指定カラム)
上記のSELECT文はよく書くと思うんですが、
カラムごとに条件を変えたSELECT文ってどうすればいいんだろうと考えたとき、
簡単にできそうと思いあれこれ試すも、WHERE句が1つしか書けなくてムズムズ…
(SQL力なさすぎるがゆえ)
#ちょっと考えたら…
やりたいイメージはできていてもなかなか形にならなかったんですが、
case文みたいなものはSQLにはないのかと。
早速ググりました。
ありました…
(知ってる人からしたら当然ですが…)
#CASEを使ってみる
指定した複数の条件ごとにカラムをもってデータを出力したい。
例のテーブル:果物の売上データ(sales_data)
→顧客番号(c_num)、年(year)、月(month)、日(date)、商品(item)、売上数(s_qty)
SELECT date,
COUNT(DISTINCT c_num) AS 購入顧客数 , SUM(s_qty) AS 売上数
FROM sales_data
WHERE year = 2019 AND month = 05 AND item = apple
GROUP BY date
ORDER BY date;
この場合、year = 2019 AND month = 05 AND item = apple
以外の条件の出力が1つのSELECT文では厳しいです。
SELECT date,
COUNT(DISTINCT CASE WHEN year = 2019 AND month = 05 AND item = apple then c_num end) AS "りんごを購入した顧客数_201905",
COUNT(DISTINCT CASE WHEN year = 2019 AND month = 05 AND item = orange then c_num end) AS "オレンジを購入した顧客数_201904",
SUM(CASE WHEN year = 2019 AND month = 05 AND item = apple then s_qty end) AS "りんごの売上数_201905",
SUM(CASE WHEN year = 2019 AND month = 05 AND item = orange then s_qty end) AS "オレンジの売上数_201904"
FROM sales_data
GROUP BY date
ORDER BY date;
COUNTやSUMの中でCASE WHENで条件を記述することでカラムごとに条件を変更することができ、横に並べて出力することができます。
CASEの場合はWHEREではなく、WHENという点に注意。
#おわりに
SQLは苦手意識あったんですが、こうして色々調べて自分で試すと理解が深まって良いと思いました。