ray88’s diary

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

SQL指南書集_既存コードを新しい体系に変換して集計(CASE文応用)

SQL 指南書集 目次 - ray88’s diary
■既存のコード体系を新しい体系に変換して集計する

【事例1】
 県コードごとの集計を地方コードごとに集計したいとき
地方コードを改めて作成するのではなく、Case文で対処する
※豪快にGROUP BY句にSELECT句のCASE式をコピーするのがポイント
※単純にGROUP BY pref_name」と変換前の列を指定すると
 正しい結果が得られないので注意。

PostgreSQLMySQLについては「GROUP BY district」のようにGROP BY句に
 別名の列を使えるが、ほかのSQLではエラーとなる。
基本的にSELECT句で付けた別名をGRUOP BY句で参照することは標準SQL違反となる。

--県コードを地方コードに再分類する--
SELECT CASE pref_name
	WHEN '徳島' THEN '四国'
	WHEN '香川' THEN '四国'
	WHEN '愛媛' THEN '四国'
	WHEN '高知' THEN '四国'
	WHEN '福岡' THEN '九州'
	WHEN '佐賀' THEN '九州'
	WHEN '長崎' THEN '九州'
ELSE 'その他' END AS districit,
SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
			WHEN '徳島' THEN '四国'
			WHEN '香川' THEN '四国'
			WHEN '愛媛' THEN '四国'
			WHEN '高知' THEN '四国'
			WHEN '福岡' THEN '九州'
			WHEN '佐賀' THEN '九州'
			WHEN '長崎' THEN '九州'
		ELSE 'その他' END;

【事例2】
事例1と同様の考え方で数値を適当な階級体系に振り分けて集計することも可能。
人口階級(pop_class)ごとの都道府県の数を調べたい場合は、以下のようなSQLとなる

--人口階級ごとに都道府県を分類する--
SELECT CASE WHEN population < 100 THEN '01'
		    WHEN population >= 100 AND population < 200 THEN '02'
			WHEN population >= 200 AND population < 300 THEN '03'
			WHEN population >= 300 THEN '04'
	   ELSE NULL END AS pop_class,
	   COUNT(*)AS cnt
FROM poptbl
GROUP BY CASE WHEN population < 100 THEN '01'
		    WHEN population >= 100 AND population < 200 THEN '02'
			WHEN population >= 200 AND population < 300 THEN '03'
			WHEN population >= 300 THEN '04'
	     ELSE NULL END
ORDER BY pop_class ASC;