示例表 :
nane | subject | score |
张三 | 语文 | 66 |
张三 | 数学 | 66 |
张三 | 英语 | 66 |
转换为:
姓名 | 语文 | 数学 | 英语 |
张三 | 66 | 66 | 66 |
方法一: 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 ) '英语'
FROMstudent_score
GROUP BYNAME
方法二 :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步查出的三张表进行连接,得出最终结果
SELECTss1.NAME,ss1.y '语文',ss2.s '数学',ss3.e '英语'
FROM( SELECT NAME, score 'y' FROM student_score WHERE SUBJECT = '语文' ) ss1JOIN ( 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 进行分组,合并成最终结果
SELECTs.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 ALLselect name,0 y,score s, 0 e from student_score where subject = '数学' UNION ALLselect name,0 y, 0 s, score e from student_score where subject = '英语' ) s
GROUP BY s.name ;