前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql面试题:行列如何互换?

sql面试题:行列如何互换?

原创
作者头像
猴子聊数据分析
修改2019-11-11 18:05:44
8850
修改2019-11-11 18:05:44
举报

​【面试题】下面是学生的成绩表(表名score,列名:学号、课程号、成绩)

使用sql实现将该表行转列为下面的表结构

【解答】

第1步,使用常量列输出目标表的结构

可以看到查询结果已经和目标表非常接近了

代码语言:javascript
复制
select 学号,'课程号0001','课程号0002','课程号0003'from score;

第2步,使用case表达式,替换常量列为对应的成绩

代码语言:javascript
复制
select 学号,(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',(case 课程号 when '0002' then 成绩 else 0 end) as  '课程号0002',(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'from score;

在这个查询结果中,每一行表示了某个学生某一门课程的成绩。比如第一行是'学号0001'选修'课程号00001'的成绩,而其他两列的'课程号0002'和'课程号0003'成绩为0。

每个学生选修某门课程的成绩在下图的每个方块内。我们可以通过分组,取出每门课程的成绩。

第3关,分组

分组,并使用最大值函数max取出上图每个方块里的最大值

代码语言:javascript
复制
select 学号,max(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',max(case 课程号 when '0002' then 成绩 else 0 end) as '课程号0002',max(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'from scoregroup by 学号;

这样我们就得到了目标表(行列互换)

如果对case表达式还不了解的,可以看下我讲过的《从零学会SQL》的“多表查询”。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档