MySQL经典行列转换

本文介绍了如何使用MySQL进行数据的行列转换,包括从行转列和列转行的操作。通过示例展示了如何使用SUM(IF())函数结合GROUP BY来实现数据聚合,以及使用UNION ALL将转换后的列重新组合成行。

MySQL经典行列转换

CREATE TABLE IF NOT EXISTS column_row_change(
name varchar(10),
subject varchar(10),
score varchar(10)
);

INSERT INTO column_row_change VALUES \
('小明','语文',96),
('小明','数学',98),
('小明','英语',95),
('大花','语文',82),
('大花','数学',86),
('大花','英语',88);

SELECT * FROM column_row_change;
+------+---------+-------+
| name | subject | score |
+------+---------+-------+
| 小明 | 语文    | 96    |
| 小明 | 数学    | 98    |
| 小明 | 英语    | 95    |
| 大花 | 语文    | 82    |
| 大花 | 数学    | 86    |
| 大花 | 英语    | 88    |
+------+---------+-------+
SELECT 
	name AS name,
	SUM(IF(subject = '语文',score,null)) AS 语文,
	SUM(IF(subject = '数学',score,null)) AS 数学,
	SUM(IF(subject = '英语',score,null)) AS 英语
FROM column_row_change
GROUP BY name ;
+------+------+------+------+
| name | 语文 | 数学 | 英语 |
+------+------+------+------+
| 小明 |   96 |   98 |   95 |
| 大花 |   82 |   86 |   88 |
+------+------+------+------+

CREATE TABLE row_column_change AS 
SELECT 
	name AS name,
	SUM(IF(subject = '语文',score,null)) AS 语文,
	SUM(IF(subject = '数学',score,null)) AS 数学,
	SUM(IF(subject = '英语',score,null)) AS 英语
FROM column_row_change
GROUP BY name ;
----------------------------------------------------
SELECT * FROM row_column_change;
+------+------+------+------+
| name | 语文 | 数学 | 英语 |
+------+------+------+------+
| 小明 |   96 |   98 |   95 |
| 大花 |   82 |   86 |   88 |
+------+------+------+------+


SELECT name, '语文' AS subject ,语文 FROM row_column_change
UNION ALL 
SELECT name, '数学' AS subject ,数学 FROM row_column_change
UNION ALL 
SELECT name, '英语' AS subject ,英语 FROM row_column_change
ORDER BY name DESC;
+------+---------+-------+
| name | subject | score |
+------+---------+-------+
| 小明 | 语文    | 96    |
| 小明 | 数学    | 98    |
| 小明 | 英语    | 95    |
| 大花 | 语文    | 82    |
| 大花 | 数学    | 86    |
| 大花 | 英语    | 88    |
+------+---------+-------+




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值