1.行转列
1.1 什么是是行转列
正常的查询结果是这样的
可是我想要的结果是这样的
这就是行转列
1.2 场景一(多行转一行多列)
可以使用下面的SQL语句(group by 与 case when结合使用即可实现):
select name,max(
case course
when 'java' then score
end) Java, max(
case course
when 'MySQL' then score
end) MySQL
from test_9
group by name;
思路分析 :
首先我们默认的情况 每个名字都输出两次,而最终结果只有一次名字,所以肯定是 以名字分组 group by
select * from test_9 group by name;
对我们来说 ,id,课程,和分数都不需要了,只需要有名字 然后再把java和mysql放上去
select name , 1 as java , 1 as MySQL from test_9 group by name;
然后再使用聚合函数聚合(此处理解“聚合”,相当于把多行数据压扁成一行)
select name,max(
case course
when 'java' then score
end) Java, max(
case course
when 'MySQL' then score
end) MySQL
from test_9
group by name;
1.3 场景二(多行转一行一列)
相关函数
concat(值,’拼接符’,值 ) : 拼接,多行数据只会拼接一行
group_concat(值,’拼接符’,值 ) : 拼接,多行压扁到一行
第一步:拆分问题,先按分组的思路
select name,1 as '各科成绩' from test_9 group by name;
第二步:将课程名与成绩拼接成一列
select name,
concat(course,'=',score) as '各科成绩'
from test_9 group by name;
第三步:利用group_concat函数将多行压扁到一行
select name,
group_concat(course,'=',score) as '各科成绩'
from test_9 group by name;
第四步:修改分隔符(默认是逗号)
select name,
group_concat(course,'=',score separator ' | ') as '各科成绩'
from test_9 group by name;
第五步:按课程名称排序
select name,
group_concat(course,'=&#