LoginSignup
3
3

More than 3 years have passed since last update.

SELECT文でカラムごとに条件指定したデータを出力したい

Posted at

やりたいこと

カラムごとに条件を変えた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は苦手意識あったんですが、こうして色々調べて自分で試すと理解が深まって良いと思いました。

3
3
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
3
3