ray88’s diary

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

SQL指南書 行持ちから列持ちへの水平展開

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);