SQL 行列轉換舉例(附實操數據)

-- 建表操作
CREATE TABLE a_test 
(
COUNTRY VARCHAR(10) NOT NULL,
POPULATION int NOT NULL,
SEX VARCHAR(10) NOT NULL
);

-- 插入數據
INSERT INTO a_test VALUES('泰國',1000,1);
INSERT INTO a_test VALUES('泰國',250,2);
INSERT INTO a_test VALUES('泰國',200,3);
INSERT INTO a_test VALUES('泰國',300,4);
INSERT INTO a_test VALUES('日本',500,1);
INSERT INTO a_test VALUES('日本',150,2);
INSERT INTO a_test VALUES('日本',250,3);
INSERT INTO a_test VALUES('日本',250,4);

原表:

如下表所示,統計日本、泰國不同性別的人口,“sex”中1代表男性、2代表女性、3代表無性、4代表雙性,
要求以(國家、男性、女性、無性、雙性)爲字段輸出表。

-- 表1:
SELECT * FROM a_test

-- 首先生成確定的字段(國家、男性、女性、無性、雙性),然後以case when來判斷性別中人口的取值

SELECT COUNTRY,SEX,
		CASE SEX WHEN 1 THEN POPULATION ELSE 0 END AS 男性,
		CASE SEX WHEN 2 THEN POPULATION ELSE 0 END AS 女性,
		CASE SEX WHEN 3 THEN POPULATION ELSE 0 END AS 無性,
		CASE SEX WHEN 4 THEN POPULATION ELSE 0 END AS 雙性
FROM a_test t

	
-- 最後使用group by來通過國家分組,並取其中的最大值(有的人會使用sum求和,效果也是一樣的)
-- 表2:
SELECT COUNTRY,
	MAX(CASE SEX WHEN 1 THEN POPULATION ELSE 0 END) AS 男性,
	MAX(CASE SEX WHEN 2 THEN POPULATION ELSE 0 END) AS 女性,
	MAX(CASE SEX WHEN 3 THEN POPULATION ELSE 0 END) AS 無性,
	MAX(CASE SEX WHEN 4 THEN POPULATION ELSE 0 END) AS 雙性
FROM a_test t
	GROUP BY t.COUNTRY ORDER BY  t.COUNTRY 

---	表3:

SELECT 
a.*,	(男性 + 女性 + 無性 + 雙性) AS 總數
FROM
(
SELECT COUNTRY,
	MAX(CASE SEX WHEN 1 THEN POPULATION ELSE 0 END) AS 男性,
	MAX(CASE SEX WHEN 2 THEN POPULATION ELSE 0 END) AS 女性,
	MAX(CASE SEX WHEN 3 THEN POPULATION ELSE 0 END) AS 無性,
	MAX(CASE SEX WHEN 4 THEN POPULATION ELSE 0 END) AS 雙性
FROM a_test t
	GROUP BY t.COUNTRY ORDER BY  t.COUNTRY 
) a

– 表的思考和轉換過程:

表1:
在這裏插入圖片描述
表2:
在這裏插入圖片描述
表3:自主探索
在這裏插入圖片描述

參考資料:https://www.cnblogs.com/ichenhao/p/8383866.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章