SQL谁才是金牌销售员?(窗口函数排名、substr)

某店铺的商品信息表中记录了有哪些商品

 订单明细表中记录了今年商品销售的流水;"订单明细表"中的'商品ID' 与"商品信息表"中的'商品ID'一一对应。

问题:统计每个区域、每月、销量TOP1销售人员

【解题思路】

本题中出现了每个区域、每月、top1等关键词,你能想到什么?

这就是《猴子从零学会SQL》里讲过的典型业务问题,也就是经典的“分组汇总+排名”问题,要用到窗口函数来解决。

1.条件筛选

使用窗口函数前,先对订单明细表进行条件筛选,本题只要统计订单状态为支付的数据。

 

对应SQL如下:


select 区域,支付时间,销量,销售人员
from 订单明细表 as a1
where 订单状态 = '支付';

2.窗口函数

窗口函数的基本语法为:


<窗口函数> over (partition by <用于分组的列名>                 
                order by <用于排序的列名>)

常用的排序函数有rankdense_rank、row_number,区别如下图。

本题中,需要统计每个区域、每月、销量TOP1销售人员。因此首先需要按照区域、月进行分组,销量降序为每个销售人员打上排名标签。

原表中没有"月"这一列,我们可以字符截取函数substr函数来获取'月'数据。substr函数用法如下:

 

本题中使用substr(支付时间,1,7) as "月"即可得到时间月列。那么使用何种类型的排序函数呢?

本题中若销量相同则计为并列排名,因此本题可以使用dense_rank排序函数。


select 区域,substr(支付时间,1,7) as "月",销售人员,
dense_rank() over(partition by 区域,substr(支付时间,1,7)
                  order by 销量 desc) as "销量排名"
from 订单明细表 as a1
where 订单状态 = '支付';

 我们来理解下窗口函数这部分语句。


dense_rank() over(partition by 区域,substr(支付时间,1,7)
                  order by 销量 desc) as "销量排名"

1)首先按照区域进行分组

2)每个分组内按销量进行降序排列(本题比较特殊,每个分组内只有1行数据)

 3)使用排序函数对每个分组打上排名标签。

2.找到TOP第1的销售人员

我们使用where语句对上一步得到的排名表t2进行筛选,即可得到本题答案。


select 区域,月,销售人员
from 
    (select 区域,substr(支付时间,1,7) as "月",销售人员,
    dense_rank() over(partition by 区域,substr(支付时间,1,7)
                      order by 销量 desc) as "销量排名"
    from 订单明细表 as a1
    where 订单状态 = '支付') as t2
where 销量排名 = 1;

 

【本题考点】

1.考察了窗口函数的应用,遇到“分组排名”问题,要想到用窗口函数解决。

2.考察了substr字符串截取函数的应用。

【举一反三】

统计每个区域销量TOP1销售人员。

参考答案:


select 区域,销售人员
from 
    (select 区域,销售人员,
    dense_rank() over(partition by 区域
                      order by sum(销量) desc) as "销量排名"
    from 订单明细表 as a1
    where 订单状态 = '支付'
    group by 区域,销售人员) as t2
where 销量排名 = 1;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值