asp.net怎么实现按条件查询_行列互换问题,怎么办?送你一个万能模版

3fc6a505a9ca5bcb2f2d45c5af32e072.png

【题目】

下面是表名为cook的表

e4e91e36f94bbc4ec9d8e6d7c30fbbea.png

要求查询结果如下:

12247b0f8a0acf8f31d7264a10ef8379.png

【解题思路】

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

2c3525906ed34d50b44a26ca2c627c3d.png

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

349338728b543535a45dde33ec7c379e.png
4c646c4971be77f6520e2f310acd9f78.png

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

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

6a07fc85810c0638781366abca9e70f5.png
select 年,m1,m2,m3,m4from cook;

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

df39414fbfa60ed45b852e96b0484504.png

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

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

07c8e67000122bbcff46ea8c1b16fb4f.png

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

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;

在这个查询结果中,每一行表示某年某月的某个值。比如第一行是2009年 1月份(m1)的值,而其他三列m2、m3、m4的值为0。

b83b1d7c7657c1407fcd9b48195f46a2.png

第二行是2009年 2月份(m2)的值,而其他三列的值为0。其他行以此类推。

4c39733c22f3e636012a5f6b290e6712.png

又向目标接近了一步,但是多出来的0值,怎么办?

3.去掉0值,简化表格的行数

可以使用分组汇总来实现。按“年”分组(group by),然后用汇总函数(max)取出每组非零的值(也就是这个案例中的某年某月对应的数值)。

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的运行过程如下:

7b6e128bd5666c02c67194c79b2534fe.png
1dc8e40d8d12fd5f6abc984e27431ae9.png

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

【本题考点】

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

07c8e67000122bbcff46ea8c1b16fb4f.png

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

72293c23efafe886b300e0081d909469.png
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;

【举一反三】

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

1166eebd4a5f603806d2936e47d6eff4.png

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

3d1040d7c2f80dc719c990d3f0eefb0b.png

参考答案:

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 学号;

输出结果:

3d1040d7c2f80dc719c990d3f0eefb0b.png

推荐:如何从零学会sql?

7467a15bfc6bfd51fa3734d4868a9de0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值