欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学生表转横表

程序员文章站 2024-03-23 09:01:52
...

一、将如下学生表转换成横表

学生表转横表

输出结果如下

学生表转横表

1、解决思路

课程有语文、数学、英语,而每个人都选择了三门课,要求是将原表转换成横表,也就是将原来的姓名和课程字段转换成姓名和语文、数学、英语字段。将课程一拆为三就需要将每门课程对应的成绩取出来。
具体流程:
1.1、根据学生姓名分类 :

学生表转横表

1. 2、按照课程名取成绩
case s.cname when ‘语文’ then s.score else 0 end

2、最终实现

select 
s.name ,
sum(case s.cname when ‘语文’ then s.score else 0 end) ‘语文’,
sum(case s.cname when ‘数学’ then s.score else 0 end) ‘数学’,
sum(case s.cname when ‘英语’ then s.score else 0 end) ‘英语’
from tb_student s 
group by name

3、为什么要使用聚合函数(sum)

(1)分组查询时除了字段后面只能跟聚合函数。
(2)在case 里面 选择当cname为‘语文’ 时取出其分数,但是在找到课程名为‘语文’之前可能和别的课程比较过了,所以要加上else 0。
(3)在这里只能是使用sum函数,在选择cname时比较不止一次,所以会产生多个else 0,这个时候只有sum函数能完成取对应课程成绩的功能。别的函数如AVG() 则会根据你比较的此处将成绩均分,这样得到的成绩就是你比较多次之后的平均成绩。
(4)使用AVG()函数得到的结果

学生表转横表

(5)正确结果

学生表转横表

相关标签: 数据库 mysql