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