SQL练习:表妹不在,没人帮我查表,只好自己来了

前言

公司的表妹休假了,这下找谁给我查表啊,没辙,只能亲自上阵了。哎?等等,表妹留下了脚本让我执行,但写的好像不怎么样嘛,我这该死的好胜心,这波非要班门弄斧一下!先来看看需求:
在这里插入图片描述
以脱敏数据为例,对 tp 重新归类,原本是 a、aa、b、c、d、dd 六类,先变成 A、b、c、D 四类,并分不同时间段计数,且按指定的新分类顺序 bADc 排序。这个需求源于工作中用到一个 excel 数据模板,格式固定,所以需要查出来的数据能直接复制粘贴到模板表里。应该怎么做呢?

一、表妹的做法

话不多说,直接先看表妹的操作。首先在子查询中通过 where 筛选本期时间段内数据,再利用 case when 对原类别重新归类,对每个新类所在列取个别名,便于下一步计数(子查询结果见下图)。如此再复刻一个不选时间的总体数据后,通过 union all 上下拼接。
在这里插入图片描述
但是最终结果却不是目标格式,这样还要在 excel 粘贴时行列转置,这不是阻止我偷懒嘛!
在这里插入图片描述

二、我的做法

我一气之下就要改表妹的脚本,常规思路,上下拼接不对,那就换左右拼接。于是一拍脑袋就想到 left join。一番百度后,洋洋洒洒的代码就出炉了,先分类,再分组统计,再排序,左表哦了;又分类,筛时间,再分组,右表哦了~合体,将将!我太牛啦!
在这里插入图片描述

三、综合改进

正沾沾自喜之时惊觉,这代码量也太累赘了吧!秉承派森尼克思想,要追求优雅的、地道的、整洁的代码,必须改进!奈何基础不扎实,百度也救不了,经大佬提示后才发现可以不用 where 来选时间段呀!还是先分类分组,然后直接利用 case when 对时间分别标记后计数,好嘞,再来,将将!
在这里插入图片描述
最后要提的一个知识点就是按指定类别排序,在 MYSQL 中可以利用 order by field(t, 'b', 'A', 'D', 'c') 指定,而在 SQLite 和 SQL Server 中却不支持,可用 case when 再造一个序列表辅助排序。以上脚本均在 MYSQL 中执行通过,可复制下方数据进行尝试,欢迎大佬指出错误和提供更优解。

tpday
a2020-09-02 16:15:20.000
a2020-09-03 16:15:20.000
aa2020-09-04 16:15:20.000
b2020-09-05 16:15:20.000
b2020-09-06 16:15:20.000
c2020-09-07 16:15:20.000
c2020-09-08 16:15:20.000
c2020-09-09 16:15:20.000
c2020-09-10 16:15:20.000
d2020-09-11 16:15:20.000
dd2020-09-12 16:15:20.000
dd2020-09-13 16:15:20.000
a2020-09-14 16:15:20.000
b2020-09-15 16:15:20.000
c2020-09-16 16:15:20.000

结语

习惯了 Python 简洁流畅的语法后,写 SQL 总是转不过弯,这次借着工作实操的机会复习了一下基础,这里是还给老师后又企图复习的 Seon塞翁,话说,SQL 其实就是 Search Question Limply (无力地寻找问题)吧,下一篇见!顺便附上 Python 解法。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值