考虑一个常见的业务场景:某零售商想要分析各个省份各个渠道维度下品牌的销售额市场份额。
品牌销售额市场份额=品牌销售额/品类总销售额
例如,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
;