SQL | グループ化とCASE文

SQL

SQLでグループ化した途端どうなってんのかわかんなくなる病気にかかっています。普段からSQLを書いてないと以前やったことができない。というわけでSQLの復習です。
実行環境はpostgreです。

グループ化とCASE文

以下のようなテーブルがあります

nameでグループ化すると重複したnameは一つにまとまりますので4レコードが取得されます。

じゃあここで、CASE式を使ってクレープを買った人は〇を付けようとします

SELECT NAME,
CASE WHEN SUM(CASE WHEN item = 'クレープ' THEN 1 ELSE 0 END) = 1
	THEN '〇' ELSE '×' END AS クレープ
FROM sales
GROUP BY NAME

この時に、なぜグループ化して4行になった?のにクレープの有無を確認できるんだ??という頭がバグってしまった笑

以下を考えるとわかりやすい

SELECT NAME,
count(NAME)
FROM sales
GROUP BY NAME

4行になった?としたらcountがそれぞれ1件になるはずだ。切り捨てられたわけじゃない。

となると・・・

SELECT NAME,
CASE WHEN SUM(CASE WHEN item = 'クレープ' THEN 1 ELSE 0 END) = 1
	THEN '〇' ELSE '×' END AS クレープ
FROM sales
GROUP BY NAME

misakaの行はカウントが2なので、misakaのゲコ太とクレープがチェックされて、クレープがあるのでsumは1となり、〇が出力される。
こんな感じだろうか・・・?

では次に以下のようなテーブルを利用して、学年ごとにクレープを持っている人が何人いるかを出力します。

ちなみに学年は以下の通りです

  • 1年生
    • saten
    • sirai
    • uiharu
  • 2年生
    • misaka
    • kongo

まずは学年を出力させるだけのcaseとgroupです

SELECT 
	CASE NAME 
		WHEN 'misaka' THEN '2年生'
		WHEN 'kongo' THEN '2年生'
		ELSE '1年生' END AS 学年
FROM sales
GROUP BY name

次にクレープを買った人数をカウントさせます。また学年をグループ化の条件に流用します

SELECT 
	CASE NAME 
		WHEN 'misaka' THEN '2年生'
		WHEN 'kongo' THEN '2年生'
		ELSE '1年生' END AS 学年
	,
	SUM(CASE WHEN item = 'クレープ' THEN 1 ELSE 0 END) AS クレープ
FROM sales
GROUP BY 学年

うまくできました。なんとなくコツを掴んできた感じがします?

関連記事

コメント

タイトルとURLをコピーしました