前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >行列互换问题,怎么办?送你一个万能模版

行列互换问题,怎么办?送你一个万能模版

原创
作者头像
猴子聊数据分析
修改2020-04-24 09:56:17
5550
修改2020-04-24 09:56:17
举报
文章被收录于专栏:猴子聊数据分析

【题目】

下面是表名为cook的表

要求查询结果如下:

【解题思路】

电影《女男变错身》中是男女互换身份

这个题其实也是“互换身份”,叫做行列互换问题,就是将一维表转化为二维表。

1.输出行列互换的表结构

可以看出,需要输出的有5列,其中只有“年”这一列是表cook中原有的,其他4列(也就是2-5列:m1对应的是1月份、m2对应的是2月份、m3对应的是3月份、m4对应的是4月份)需要自己创建。

代码语言:javascript
复制
select 年,m1,m2,m3,m4from cook;

可以看出查询结果和目标表的列名结构一样,但是2-5列(m1、m2、m3、m4)的值不是题目要求的:

2. 如何将2-5列的值替换成对应的值?

可以用case语句进行条件判断来替换。

年份和月份匹配,则为对应值,不匹配则为0。

代码语言:javascript
复制
select 年,(case 月 when '1' then 值 else 0 end) as m1,(case 月 when '2' then 值 else 0 end) as m2,(case 月 when '3' then 值 else 0 end) as m3,(case 月 when '4' then 值 else 0 end) as m4from cook;
代码语言:javascript
复制
select 年,max(case 月 when '1' then 值 else 0 end) as 'm1',max(case 月 when '2' then 值 else 0 end) as 'm2',max(case 月 when '3' then 值 else 0 end) as 'm3',max(case 月 when '4' then 值 else 0 end) as 'm4'from cookgroup by 年;

这个sql的运行过程如下:

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

【本题考点】

1.考查用case语句进行数据替换,和条件判断

2.遇到行列互换的问题,可以用下面的万能模版来解决。

代码语言:javascript
复制
select A,-- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取max(case B when 'm' then C else 0 end) as 'm',max(case B when 'n' then C else 0 end) as 'n'from cook-- 第1步,在行列互换结果表中按第1列分组group by A;

【举一反三】

下面是学生的成绩表(表名:成绩表,列名:学号,课程,成绩)

使用sql语句实现将该表行转化为下面的表结构:

参考答案:

代码语言:javascript
复制
select 学号,-- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取max(case 课程 when '语文' then 成绩 else 0 end) as 语文成绩,max(case 课程 when '数学' then 成绩 else 0 end) as 数学成绩from 成绩表-- 第1步,在行列互换结果表中按第1列分组group by 学号;

输出结果:

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

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

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

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

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