表行列转置(数据库常考)
2015-01-06 15:51 钟铧若岩 阅读(377) 评论(0) 收藏 举报第一次写博客,就整个与数据库相关的吧
表如下:(表名wfgtest1,wfg我的小名)
| NAME | COURSE | GRADE |
|---|---|---|
| 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来说是一小步,但对我个人来说是一大步!
加油!
浙公网安备 33010602011771号