ITPub博客

首页 > 数据库 > 数据库开发技术 > 打工人打工魂!销售分析案例来啦!

打工人打工魂!销售分析案例来啦!

原创 数据库开发技术 作者:猴子数据分析 时间:2022-07-14 20:00:00 0 删除 编辑


某公司要了解1月、2月各个销售员的销售情况怎么样?销售记录表如下:



要求输出格式如下:




【解题思路】


此题主要考察 case when 行列的转换问题,即如下图所示:



通过case when 的转换,把列的项目转换成行字段,有两种方法供参考,其中第一个方法较为简洁。


一、行列转换汇总求和


1、利用cese when语句先分别对销售员判断,然后得到每个销售员每日的销售金额。销售员原来为列里的一项,通过case when 转换为行的项目


selectcase when 销售员='小明' then 销售额 else 0 end as 小明日销额,case when 销售员='小张' then 销售额 else 0 end as 小张日销额,case when 销售员='小王' then 销售额 else 0 end as 小王日销额,case when 销售员='小李' then 销售额 else 0 end as 小李日销额from 销售记录表;


2、加上日期字段进行查询


select 日期,case when 销售员='小明' then 销售额 else 0 end as 小明日销额,case when 销售员='小张' then 销售额 else 0 end as 小张日销额,case when 销售员='小王' then 销售额 else 0 end as 小王日销额,case when 销售员='小李' then 销售额 else 0 end as 小李日销额from 销售记录表;


3、按月份、销售员汇总

1)、因销售记录中时间字段是具体的日期,题目要求是按照“月份”分组,需要用date_format函数把日期转为月份。

2)、对销售员按照“月份”汇总,在case when 筛选的基础上再用sum求和,得到每个销售员每个月总的销售金额。



select date_format(日期,'%Y %m') as 月份,sum(case when 销售员='小明' then 销售额 else 0 end) as 小明,sum(case when 销售员='小张' then 销售额 else 0 end) as 小张,sum(case when 销售员='小王' then 销售额 else 0 end) as 小王,sum(case when 销售员='小李' then 销售额 else 0 end) as 小李from 销售记录表group by date_format(日期,'%Y %m');


得到查询结果:


二、临时表查询


1、利用cese when语句先分别对销售员判断,得到每个销售员每日的销售金额,销售员原来为列里的一项,通过case when 转换为行的项目


select 日期,case when 销售员='小明' then 销售额 else 0 end as 小明日销额,case when 销售员='小张' then 销售额 else 0 end as 小张日销额,case when 销售员='小王' then 销售额 else 0 end as 小王日销额,case when 销售员='小李' then 销售额 else 0 end as 小李日销额from 销售记录表;


2、把第一步的查询作为一个临时表a,然后对表a的查询结果按月份进行汇总查询。

select date_format(a.日期,'%Y %m') as 月份,sum(a. 小明日销额) as 小明,sum(a.小张日销额) as 小张,sum(a. 小王日销额)  as 小王,sum(a. 小李日销额) as 小李from(select 日期,case when 销售员='小明' then 销售额 end as 小明日销额,case when 销售员='小张' then 销售额 end as 小张日销额,case when 销售员='小王' then 销售额 end as 小王日销额,case when 销售员='小李' then 销售额 end as 小李日销额from 销售记录表)agroup by  date_format(a.日期, '%Y %m');



上面的结果与题意要求的还有些差距,因“小李”1月份没有销售额,该值为NULL,因题意要求为0,利用case when 把NULL改为 0,调整代码如下:


select date_format(a.日期,'%Y %m') as 月份,case when sum(a.小明日销额) is NULL then 0 else sum(a.小明日销额)  end as 小明,case when sum(a.小张日销额) is NULL then 0 else sum(a.小张日销额)  end as 小张,case when sum(a.小王日销额) is NULL then 0 else sum(a.小王日销额)  end as 小王,case when sum(a.小李日销额) is NULL then 0 else sum(a.小李日销额)  end as 小李from(select 日期,case when 销售员='小明' then 销售额 end as 小明日销额,case when 销售员='小张' then 销售额 end as 小张日销额,case when 销售员='小王' then 销售额 end as 小王日销额,case when 销售员='小李' then 销售额 end as 小李日销额from  销售记录表) agroup by  date_format(a.日期, '%Y %m');


得到要求的结果如下:



【本题考点】

1、重点考查用case when语句进行列数据转换和条件判断,在实际工作中,这个语句是经常用到的



   case when <判断表达式> then <表达式> else <表达式> end



另外,case when有两种格式:简单函数,搜索函数。他们的用法,详见case when 函数的详细介绍。

2、case when表达式的聚合,可以用sum,max,avg等对筛选的表达式结果再进行一次聚合,如:


sum(case when <判断表达式> then <表达式> else <表达式> end )


3、年+月的表达方法

  SQL中,单独的对字段取年、月,用相应的函数



year(日期字段)   对日期字段取年份

month(日期字段)  对日期字段取月份



但是,要取“年+月”,可以采用函数


date_format(date,format)



date_format(date,format )函数为SQL中设置时间格式的函数,其中括号里的“date”是要设置的日期,“format” 是设置成规定日期/时间的格式。根据format字符串格式化date值。下列字符和字符串是常用的:



格式化日期常用的字符串:



 ⬇️点击「阅读原文」

 免费报名 数据分析训练营

原文作者:猴子数据分析;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-01-16

  • 博文量
    865
  • 访问量
    345512