SQL语句计算销售额市场份额

考虑一个常见的业务场景:某零售商想要分析各个省份各个渠道维度下品牌的销售额市场份额。

品牌销售额市场份额=品牌销售额/品类总销售额

例如,sales 表格如下:

从上述表格中,我们可以看到包装水品类各品牌包含的商品每月在各个省份各个渠道的销量和销售额信息。

现在我们使用SQL来计算每个品牌在每月各个省份各个渠道对应的销售额份额。

--方法一:开窗函数1

select month
	   ,province_name
	   ,channel
	   ,category
	   ,brand_name
	   ,amt_brand/amt_total market_share --计算销售额份额
from (
	select month	
	      ,province_name	
	      ,channel
		  ,category
	      ,brand_name		
	      ,sum(sum(amount)) over(PARTITION  by month,province_name,channel,category,brand_name) amt_brand --分子
		  ,sum(sum(amount)) over(PARTITION  by month,province_name,channel,category) amt_total --分母
	from sales
	group by month	
	      	,province_name	
	      	,channel	
		  	,category
	      	,brand_name
);



------------------------------------------------------------------------------------
--方法一:开窗函数2

select month	
	      ,province_name	
	      ,channel
		  ,category
	      ,brand_name		
	      ,sum(sum(amount)) over(PARTITION  by month,province_name,channel,category,brand_name)/sum(sum(amount)) over(PARTITION  by month,province_name,channel,category) market_share
	from sales
	group by month	
	      	,province_name	
	      	,channel	
		  	,category
	      	,brand_name

在上述SQL中,我们使用了开窗函数来分别计算了分子品牌销售额amt_brand和分母品类总销售额amt_total,然后利用公式计算了销售额份额market_share。当然这里我们可以省略计算分子分母那一步,直接算出销售额份额指标来,如上述代码中第二部分所示。

SQL运行后,数据如下:

从数据结果,我们可以看到2021年01月农夫山泉在安徽省各个渠道的销售额市场份额,如大卖场为55%。

我们也可以不使用开窗函数,先按照不同维度分别计算分子和分母的结果,然后通过关联再计算最终的销售额市场份额指标,如下代码所示。


--方法二:分子分母单独计算
with brand as 
(
	select month	
	      ,province_name	
	      ,channel
		  ,category
	      ,brand_name		
	      ,sum(amount) amt_brand
	from sales
	group by month	
	      	,province_name	
	      	,channel	
		  	,category	
	      	,brand_name
),
total as (
	select month	
	      ,province_name	
	      ,channel
		  ,category
	      ,sum(amount) amt_total
	from sales
	group by month	
	      	,province_name	
	      	,channel	
		  	,category
		  	
)
select a.month
	   ,a.province_name
	   ,a.channel
	   ,a.category
	   ,brand_name
	   ,amt_brand/amt_total market_share
from brand  a 
join total b  
on a.month=b.month
and a.province_name = b.province_name 
and a.channel = b.channel 
and a.category = b.category
;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值