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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值