Power BI之DAX神功:第4卷第15回 计算同店销售金额「同类对比」
我经常跟大家说:四张表含以上,不是大神就是笑话。
《权威指南》这节课你蒙了吗?没蒙的人≈最接近神的人,蒙的人=新人
新人经过努力,总有一天,你会成为超越神的人,相信自己的潜力,加油!
一、先谈业务需求与表格准备

【1】铁打的江山流水的兵
江山好比一个企业,每家门店就相当于兵,门店可能因为各种因素停业(拆迁、亏损撤店、被人举报、装修等等),同时也会有新店开张。
在分析过程中,会遇到这样一种情况,张三是一店的店长,这个店没有停业,由于某个类别没有销售(也可以深入到某个商品),原因很多:根据法律(含民族习惯等原因),此地区不适宜销售此类别商品、店铺面积原因精简销售品类(100平米和10000平米品类肯定不同)等等。
如果我们按常规的分析:
返回结果如下图所示:红圈显示的都是BLANK,那么这些店铺手柄这个类是销售为零呢?还是因为店铺在这个月份没有营业?或者采购就没有给店铺上这个品类?我们做销售分析时,应该只看有这个商品的店铺之间的对比。
例如:有一部电影A国销售1万份,B国没引进,C国引进了但是销售为0。这时你要用A国与C国对比,而不应该把B国参考进来。

【2】状态表找谁要
从我们上面提供的状态表中可以看出:

类别G2(手柄)在每家店铺每个月是否经营:(如果装修,闭店等所有类别全是关)

问题来了,状态表找谁要?不同企业负责部门不同,但是有一个通用部门他一定有:采购
当一家店铺新开张时:采购会通知供货商铺货
当一家店铺倒闭时:采购会通知供货商退货
当一家店铺要开始装修时:采购会通知供货商退货
当一家店铺装修后重新营业时:采购会通知供货商铺货
当一家店铺新增加一个品类时:采购会通知供货商铺货
当一家店铺撤销一个品类时:采购会通知供货商退货
我说的是企业,你别拿小卖部这里说:)
好了,这个数据你找采购要,如果他们不给你,你把我上面这6句话念给他们听,祝平安!
因为这些事情你自己用数据无法分析,第1次出现销售并不代表这个品类上线时间是这天或这个月,茅台、五粮液可能三年卖了两瓶。
【3】我们需要一个什么结果
游戏机的类别是G1,2021年1月至3月,G1类别都有开通的店铺是:一店和二店
二店在2021年1月是0销售,所以应该对为参照店。

因为三店并不是在2021年1月至3月期间都有经营游戏机,所以此日期之内对比游戏机这个类别销售时,三店不应该做参照店。
二、再谈关系建模
【1】为什么建日期表
因为销售表【日期】是详细到天的,状态表【日期】是年月
你会不会问我?那我们新建一个销售表【年月】不香吗?
是因为销售表【年月】与状态表【日期】是多对多关系吗?
不是,这里多对多关系是无法避开的,日期表在这里只是为了更多颗粒度。
我担心有些人不想学习,照着案例去套用,所以这里没敢省略日期表。
【2】为什么要准备类别表
因为商品表【类别】与状态表【类别】是多对多关系,我们这里是避开多对多关系
详见《DAX神功》第4卷第8回 使用公共维度处理多对多关系
【3】关系模型应该如何建立

商品表~销售表:1对多关系,通过商品编码连接
类别表~商品表:1对多关系,通过类别号~类别
类别表~状态表:1对多关系,通过类别号~类别
店铺表~状态表:1对多关系,通过店号连接
店铺表~销售表:1对多关系,通过店号连接
日期表~销售表:1对多关系,通过Date~日期
日期表~状态表:多对多关系,日期表筛选状态表,通过年月~日期
这7条线,只有日期表~状态表,避不开的多对多,即便使用公共维度来处理,也要修改箭头方向。其它表与表关系,完全是业务,是自己的业务就不会连错。
三、开始分析
【1】每家店铺经营状态

但是这样做并不智能,如下图所示,我没有筛选类别时

因二店在2021年3月有两个状态,他只显示其中一个状态。如果我们只让他显示唯一,否则返回BLANK(),我们首先应该想到的是SELECTEDVALUE()函数。
原理详见《DAX神功》第2卷第19回
【2】将上面的状态列以度量值形式显示
如下图所示:2021年3月因为同时拥有开和关两个状态,所以在未筛选时,会显示BLANK()

当我筛选时,只要它有唯一值,就会返回唯一值,如下图所示:

【3】只需要让2021年1月、2月、3月全为开的店铺显示
只需要删除对日期表[年月]的筛选
这里有个小技巧:你不可能所有店全关了,都倒闭了还分析什么?取消了日期表[年月]的筛选就显示大家都有的状态【开】,在不筛选时,2021年1月至3月只有一店状态全开

当我筛选游戏机时,2021年1月至3月只有一店和二店在游戏机这个类别上状态全开

【4】我们的需要是要将这些状态全开的店铺对应的销量筛选出来
那你看看模型关系,状态表能筛选销售表吗?肯定不行,这时需要用到数据沿袭
我们在前面课程中多次实践,SUMMARIZE保留第1参数的数据沿袭。我们在新建表中测试:
返回结果:得到了店名与类别非重复组合,且保留数据沿袭

我们利用上一步写出的度量值【显示全部为开的店】筛选这个表:
语法:filter(表,度量值="某个值") 咱们讲Filter时提到的知识,为什么Calculate可以筛选,还要学filter因为当度量值="某个值"你就用到Filter高级筛选器了。
返回:2021年1月至3月店铺类别状态都为“开”的组合

【5】写出我们的度量值
切片器没有筛选时,在2021年1月至3月期间只有一店和二店拥有状态全开

当我筛选手柄时:因为只有一店状态全开,所以只显示一店销量

当我筛选游戏机时:因为只有一店和二店状态全开,所以只显示一店和二店销量

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等