前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快出来,收快递啦

快出来,收快递啦

原创
作者头像
猴子数据分析
修改2021-05-31 10:36:09
7010
修改2021-05-31 10:36:09
举报
文章被收录于专栏:猴子数据分析

【面试题】

有一张“快递揽收表”,包含3列:运单号、客户id、创建日期。

问题:查询运单创建日期在0501-0531期间不同单量区间的客户分布。最终得出的数据如下:

【解题步骤】

1. 汇总分析

计算0501-0531期间每个客户的单量,涉及到“每个”,要想到《猴子 从零学会SQL》里讲过的用分组汇总来解决这类问题。按“客户id”分组,对“运单号”统计数目得到单量(count),注意要用distinct对运单号去重。

代码语言:javascript
复制
1 select 客户id,
2        count(distinct 运单号) as 单量
3 from 快递揽收表
4 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’
5 group by 客户id;

查询结果(中间结果一):

2. 子查询

在上一步的基础上,还无法得到要求的“最终结果”。因为,“最终结果”里面获取的是不同单量区间的客户数量分布。

所以,还要在上一步的基础上(作为子查询)获取不同客户所处的单量区间。不同区间这种问题怎么办呢?

要想到《猴子 从零学会SQL》里讲过的多条件判断,也就是用到case语句

代码语言:javascript
复制
1 select 客户id,单量,
2        (case when 单量 <= 5 then ‘0-5’
3             when 单量 >= 6 and 单量 <= 10 then ‘6-10’
4             when 单量 >= 11 and 单量 <= 20 then ‘11-20’
5             else ‘20以上’
6          end) as 单量区间
7 from
8 (
9 select 客户id,
10        count(distinct 运单号) as 单量
11 from 快递揽收表
12 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’
13 group by 客户id
14 ) as t1;

查询结果(“中间结果二”):

但是和最终结果对比发现,还需要得到客户数,怎么办?

在上一步查询结果的基础上(作为子查询),再使用一次汇总分析,按“单量区间”分组(group by),对客户id汇总得到客户数(count)。

代码语言:javascript
复制
1 select 单量区间 as 单量,
2        count(distinct 客户id) as 客户数
3 from
4  (
5 select 客户id
6 ,单量
7 ,case when 单量 <= 5 then ‘0-5’
8     when 单量 >= 6 and 单量 <= 10 then ‘6-10’
9 when 单量 >= 11 and 单量 <= 20 then ‘11-20’
10 else ‘20以上’ end as 单量区间
11 from
12 (
13 select 客户id
14 ,count(distinct 运单号) as 单量
15 from 快递揽收表
16 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’
17 group by 客户id
18 ) as t1
19 ) as t2
20 group by 单量区间;

运行SQL语句,得到“最终结果”:

《猴子 从零学会SQL》里教的,把“最终结果”导出到Excel里,对数据进行可视化可以更方便的观察数据。

【本题考点】

1.当遇到“每个”这类问题,要想到用分组汇总或者窗口函数 

2.考查对子查询的灵活使用,嵌套了两次子查询,也就是把上一步查询结果作为子查询

3.考查对常见函数的了解:count()、group by()、distinct、case when,以及它们的组合使用

4.当遇到“区间”问题的时候,要想到用多条件判断(case语句)解决

5.考察遇到业务问题,如何用逻辑树分析方法把复杂问题变成矿业解决的子问题

【举一反三】

查询运单创建日期在0501-0531期间不同单量区间的客户占比。

与原答案的区别是:最终查询的结果是客户占比。

所以,需要查询客户总数;然后使用多表查询来计算客户占比。

代码语言:javascript
复制
1 select count(distinct 客户id) as 客户总数
2 from 快递揽收表
3 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’;

将原答案与“客户总数”联结,同时使用concat()函数将小数转化成百分数。

代码语言:javascript
复制
1 select a.单量,
2        concat(round(a.客户数/b.客户总数,4)*100,’%’) as 客户占比
3 from
4 (
5 select 单量区间 as 单量
6 ,count(distinct 客户id) as 客户数
7 from
8  (
9 select 客户id
10 ,单量
11 ,case when 单量 <= 5 then ‘0-5’
12     when 单量 >= 6 and 单量 <= 10
13  then ‘6-10’when 单量 >= 11 and 单量 <= 20 then ‘11-20’
14 else ‘20以上’ end as 单量区间
15 from
16 (
17 select 客户id
18 ,count(distinct 运单号) as 单量
19 from 快递揽收表
20 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’
21 group by 客户id
22 ) as t1
23 ) as t2
24 group by 单量区间
25 ) as a
26 left join
27  (
28 select count(distinct 客户id) as 客户总数
29 from 快递揽收表
30 where 创建日期 >= ‘2020-05-01’ and 创建日期 <= ‘2020-05-31’
31 ) as b
32  on 1 = 1;

推荐:如何从零学会SQL?

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档