MYSQL实现行转列的三种方式

示例表 :

nanesubjectscore
张三语文66
张三数学66
张三英语66

转换为:

姓名语文数学英语
张三666666

 

方法一: case when
SELECT NAME,
	max( CASE SUBJECT WHEN '语文' THEN score END ) '语文',
	max( CASE SUBJECT WHEN '数学' THEN score END ) '数学',
	max( CASE SUBJECT WHEN '英语' THEN score END ) '英语' 
FROM
	student_score 
GROUP BY
	NAME
方法二 :join
--1. 先查询出每个学科表数据,即获取一列的数据
select name,score 'y' from student_score where subject = '语文';
select name,score 's' from student_score where subject = '数学';
select name,score 'e' from student_score where subject = '英语';
/*
查询结果类似如下:
name  y
张三	78
李四	89
王五	99
*/

--2. 将第1步查出的三张表进行连接,得出最终结果
SELECT
	ss1.NAME,
	ss1.y '语文',
	ss2.s '数学',
	ss3.e '英语' 
FROM
	( SELECT NAME, score 'y' FROM student_score WHERE SUBJECT = '语文' ) ss1
	JOIN ( SELECT NAME, score 's' FROM student_score WHERE SUBJECT = '数学' ) ss2 ON ss1.NAME = ss2.NAME 
	JOIN ( SELECT NAME, score 'e' FROM student_score WHERE SUBJECT = '英语' ) ss3 ON ss1.NAME = ss3.NAME;
方法三:union all
--1. 第1步和 join 方式一样,查询出每个学科表数据
select name,score 'y' from student_score where subject = '语文';
select name,score 's' from student_score where subject = '数学';
select name,score 'e' from student_score where subject = '英语';
/*
查询结果类似如下:
name  y
张三	78
李四	89
王五	99
*/

--2. 通过 union all 将三个表合并起来,并通过 name 进行分组,合并成最终结果
SELECT
	s.NAME,
	max( s.y ) '语文',
	max( s.s ) '数学',
	max( s.e ) '英语' 
FROM
	(	SELECT NAME, score y, 0 s, 0 e FROM	student_score WHERE	SUBJECT = '语文' 
	UNION ALL
		select name,0 y,score s, 0 e from student_score where subject = '数学' 
	UNION ALL
		select name,0 y, 0 s, score e from student_score where subject = '英语' ) s
GROUP BY s.name ;



 

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值