SQL 指南書集 目次 - ray88’s diary
SQL指南書 行持ちから列持ちへの水平展開 - ray88’s diary
■以下のテーブルを行持ちから列持ちへ水平展開する
以下のように表頭に合計や再掲の列を持つクロス表を作る。
※「全国」は東京等も含めたテーブルに存在するデータ全ての合計人口
※「四国(再掲)」は四国4県の合計値
SELECT CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '不明' END AS 性別 ,SUM(population)AS 全国 ,SUM(CASE WHEN pref_name = '徳島' THEN population ELSE 0 END) AS 徳島 ,SUM(CASE WHEN pref_name = '香川' THEN population ELSE 0 END) AS 香川 ,SUM(CASE WHEN pref_name = '愛媛' THEN population ELSE 0 END) AS 愛媛 ,SUM(CASE WHEN pref_name = '高知' THEN population ELSE 0 END) AS 高知 ,SUM(CASE WHEN pref_name IN ('徳島', '香川', '愛媛', '高知') THEN population ELSE 0 END) AS 四国(再掲) FROM poptbl2 GROUP BY sex ORDER BY sex;
【参考】テーブル作成用SQL
CREATE TABLE PopTbl2 (pref_name VARCHAR(32), sex CHAR(1) NOT NULL, population INTEGER NOT NULL, PRIMARY KEY(pref_name, sex)); INSERT INTO PopTbl2 VALUES('徳島', '1', 60 ); INSERT INTO PopTbl2 VALUES('徳島', '2', 40 ); INSERT INTO PopTbl2 VALUES('香川', '1', 100); INSERT INTO PopTbl2 VALUES('香川', '2', 100); INSERT INTO PopTbl2 VALUES('愛媛', '1', 100); INSERT INTO PopTbl2 VALUES('愛媛', '2', 50 ); INSERT INTO PopTbl2 VALUES('高知', '1', 100); INSERT INTO PopTbl2 VALUES('高知', '2', 100); INSERT INTO PopTbl2 VALUES('福岡', '1', 100); INSERT INTO PopTbl2 VALUES('福岡', '2', 200); INSERT INTO PopTbl2 VALUES('佐賀', '1', 20 ); INSERT INTO PopTbl2 VALUES('佐賀', '2', 80 ); INSERT INTO PopTbl2 VALUES('長崎', '1', 125); INSERT INTO PopTbl2 VALUES('長崎', '2', 125); INSERT INTO PopTbl2 VALUES('東京', '1', 250); INSERT INTO PopTbl2 VALUES('東京', '2', 150);