环境是Mysql8.03,用mysql全系列都可以,可视化页面是Navicat;
使用学生考试成绩表作为参考对数据库行列转置进行说明,因为只使用到CASE WHEN函数,未涉及复杂函数,所以适应于SqlServer、Oracle、Pgsql等任何关系型数据库
建表语句如下:
create table StuGrade
(
Sname char(10), -- 学生姓名
Cname char(10), -- 课程名称
Grade float -- 分数
);
insert into StuGrade values('刘亦菲','数学',92);
insert into StuGrade values('刘亦菲','数据库',85);
insert into StuGrade values('刘亦菲','信息系统',92);
insert into StuGrade values('周杰伦','数学',66);
insert into StuGrade values('周杰伦','数据库',83);
insert into StuGrade values('周杰伦','信息系统',66);
insert into StuGrade values('周润发','信息系统',59);
insert into StuGrade values('梁朝伟','信息系统',66);
具体实现语句,使用SUM()
SELECT
Sname,
SUM(CASE Cname WHEN '数据库' THEN grade END) AS '数据库',
SUM(CASE Cname WHEN '数学' THEN grade END) AS '数学' ,
SUM(CASE Cname WHEN '信息系统' THEN grade END) AS '信息系统'
FROM StuGrade
GROUP BY Sname;
使用MAX()
SELECT
Sname,
MAX(CASE Cname WHEN '数据库' THEN grade END) AS '数据库',
MAX(CASE Cname WHEN '数学' THEN grade END) AS '数学' ,
MAX(CASE Cname WHEN '信息系统' THEN grade END) AS '信息系统'
FROM StuGrade
GROUP BY Sname;
因为SUM和MAX都是起到聚合作用,且满足条件的只有一个值,所以两者的效果是一样的,结果如下: