在将varchar值id转换为int时失败_leetcode题库-sql练习精讲系列--十七、行列转换问题...

1ae15125bc5913a76959c044e4289c00.png

这是一个系列文章,这个系列的理念是通过一道题,搞懂一类题。涵盖了SQL面试最常考的知识点。搞懂这些题,面试时工作中sql不可能有问题。

文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。

希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦

一、问题-leetcode题库-1179.重新格式化部门

有一张部门收入表。这表表有保存了三列信息,为部门编号,月份,收入。现要求编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月的收入(revenue)列。

653d9a6dafc10bcc770fbafc406960f7.png

二、准备

create table 部门收入表 (
部门编号 int(20),
收入 int,
月份 varchar(10));

insert into 部门收入表 values
(1,8000,"Jan"),
(2,9000,"Jan"),
(3,10000, "Feb"),
(1,7000,"Feb"),
(1,6000,"Mar");

三、解题

[解题思路]

1.正确理解题意。使得新的表中有一个部门 id 列和一些对应 每个月的收入(revenue)列。

根据题目的意思,一个部门编号对应十二个月份的列。所以由下图左表转化为右表。

27aae87b7023e913396c7a6602e1cd1f.png

2.如何实现表的行转列。

前面的文章中我们学习过case... when...,这里解释下:

CASE表达式会对最初的WHEN字句中的<判断表达式>进行判断开始执行。如果该表达式的真值为真(TRUE),那么就返回THEN字句中的表达式,CASE表达式到此为止。如果结果不为真,那么就跳转到下一句WHEN字句的判断之中。如果直到最后的WHEN字句为止返回结果都不为真,那么就会返回ELSE中的表达式,执行终止。

我们使用case...when...找出了每个月的收入,现在要将收入转换到列上,可以使用聚合函数,如sum,max,min等函数。

SELECT 
    

47cc1162f053a1b97e1067c99f6eae97.png

这里的结果是不管部门,计算了收入的月汇总。我们现在加入分组,按照月份统计。

3.按照部门分组

使用分组函数group by。

SELECT 
    

[代码]

SELECT 
    

97a671140ba9815efd3baf3d047f73bd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值