-- 建表操作
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:自主探索