谁才是金牌销售员?

某店铺的商品信息表中记录了有哪些商品
订单明细表中记录了今年商品销售的流水;"订单明细表"中的'商品ID'与"商品信息表"中的'商品ID'一一对应 。
问题:统计每个区域、每月、销售金额TOP1销售人员
【解题思路】
本题中出现了每个区域、每月、top1等关键词,你能想到什么?
这就是《猴子从零学会SQL》“分组汇总+排名”问题,要用到窗口函数来解决 。
1.条件筛选
使用窗口函数前,先对订单明细表进行条件筛选,本题只要统计订单状态为支付的数据 。
对应SQL如下:
select 区域,支付时间,销量,销售人员from 订单明细表 as a1where 订单状态 = '支付';
查询结果:
2.窗口函数

谁才是金牌销售员?

文章插图
窗口函数的基本语法为:
<窗口函数> over (partition by <用于分组的列名>order by <用于排序的列名>)
常用的排序函数有rank、、,区别如下图 。
本题中,需要统计每个区域、每月、销量TOP1销售人员 。因此首先需要按照区域、月进行分组,销量降序为每个销售人员打上排名标签 。
原表中没有"月"这一列,我们可以字符截取函数函数来获取'月'数据 。函数用法如下:
本题中使用(支付时间,1,7) as "月"即可得到时间月列 。那么使用何种类型的排序函数呢?
本题中若销量相同则计为并列排名,因此本题可以使用排序函数 。
select 区域,substr(支付时间,1,7) as "月",销售人员,dense_rank() over(partition by 区域,substr(支付时间,1,7)order by 销量 desc) as "销量排名"from 订单明细表 as a1where 订单状态 = '支付';
查询结果:
我们来理解下窗口函数这部分语句 。
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 a1where 订单状态 = '支付') as t2where 销量排名 = 1;
查询结果:
【本题考点】
1.考察了窗口函数的应用,遇到“分组排名”问题,要想到用窗口函数解决 。
2.考察了字符串截取函数的应用 。
【举一反三】
统计每个区域销量TOP1销售人员 。
参考答案:
select 区域,销售人员from (select 区域,销售人员,dense_rank() over(partition by 区域order by sum(销量) desc) as "销量排名"from 订单明细表 as a1where 订单状态 = '支付'group by 区域,销售人员) as t2where 销量排名 = 1;
查询结果:
【谁才是金牌销售员?】推荐:如何从零学会SQL?