ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL_指南書 異なる条件の集計を1つのSQLで行う(CASE式の応用)

SQL 指南書集 目次 - ray88’s diary
【事例】県別の人口を保持するテーブルに性別を付け加えたテーブルから
     男女別・県別の人数の合計を求める

【サンプルコード1】
 以下は素人が書いた場合のSQL。2回に分けて男性の人口・女性の人口を抽出し、
 そのあとにホスト言語やアプリケーション側(Excelなど)でクロス表形式に整形する

--男性の人口
SELECT pref_name,
	   SUM(population)
FROM popTbl2
WHERE sex = '1'
GROUP BY pref_name;
--女性の人口
SELECT pref_name,
	SUM(population)
FROM popTbl2
WHERE sex = '2'
GROUP BY pref_name;

【サンプルコード2】
以下はプロの書いたSQL
「行持ち」のデータから「列持ち」データに水平展開して
クロス集計形式で結果が出力される
このテクニックはSUMに限らず集計関数であればAVGやCOUNTでも同様に使える
WHERE句でWHERE句で条件分岐させるのは素人。プロはSELECT句で分岐させる

SELECT pref_name,
	--男性の人口
	SUM(CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
	--女性の人口
	SUM(CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f
	FROM popTbl2
	GROUP BY pref_name
	ORDER BY pref_name;