代码改变世界

表行列转置(数据库常考)

2015-01-06 15:51  钟铧若岩  阅读(377)  评论(0)    收藏  举报

第一次写博客,就整个与数据库相关的吧

表如下:(表名wfgtest1,wfg我的小名)

NAMECOURSEGRADE
wfg 数学 90
wfg 英语 80
wfg 语文 100
lxx 语文 100
lxx 数学 90
lxx 英语 80
wly 语文 100
wly 数学 90
wly 英语 80

表1

-- 创建学生成绩表 SC
CREATE TABLE IF NOT EXISTS SC (
    NAME VARCHAR(20) NOT NULL COMMENT '学生姓名',
    COURSE VARCHAR(20) NOT NULL COMMENT '课程名称',
    GRADE INT NOT NULL COMMENT '考试分数'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '学生成绩表';



INSERT INTO SC (NAME, COURSE, GRADE) VALUES
('wfg', '数学', 90),
('wfg', '英语', 80),
('wfg', '语文', 100),
('lxx', '语文', 100),
('lxx', '数学', 90),
('lxx', '英语', 80),
('wly', '语文', 100),
('wly', '数学', 90),
('wly', '英语', 80);

 

 

这个表很好看吧,也是我们学院派经常存的student,course,sc表,问题来了,请问怎么把这个表转换成如下表呢?

 

NAME语文数学英语
wly 100 90 80
lxx 100 90 80
wfg 100 90 80

表2 

 

采用如下sql可以搞定!!!

1 select name ,
2 sum(case COURSE when '语文' then GRADE else 0 end ) as 语文,
3 sum(case COURSE when '数学' then GRADE else 0 end ) as 数学,
4 sum(case COURSE when '英语' then GRADE else 0 end ) as 英语
5 from wfgtest1 
6 group by name

一般的题就是这样, 现在转换一个思路,请问如何把表2换成表1呢? 

这个事件告诉我们,要能举一返三。进得去还要出得来

再奉上代码

1 select name,'语文' as course,语文 as grade from wfgtest1  union all 
2 select name,'数学' as course,数学 as grade from wfgtest1  union all 
3 select name,'英语' as course,英语 as grade from wfgtest1

亲:2015第一个博文,此博文对cnblogs来说是一小步,但对我个人来说是一大步!

加油!