Power BI之DAX神功:第3卷第10回 计算新客户 方法与原理
关于《The Definitive Guide to DAX》本章节:将销售额的计算范围缩小至首年客户与之前有一个计算从未购买某些产品的客户数量,这两个案例,我们放到《DAX神功》第3卷末精讲ALLSELECTED时再分析,我不习惯使用还没有讲过的知识来讲解。
方法一:简单粗暴
// 推荐这种方法:新增列会占用内存,请问是内存贵,还是植发贵?你较劲脑汁掉的头发,想恢复头发的数量估计:30T内存=1次植发。话出回来真的会占用内存吗?我看未必,你新建一个日期表,比我新建一个列一定省内存吗?不绝对吧?新建日期表目的只是为了获取更多维度,如果没有这个需求,我觉得没有必要新建日期表。
课件来自:《跟着孙兴华学习数据分析 第一季 销售篇》第8集
文件名:08.计算新客户数量.xlsx

【新建列】
// 《DAX神功》第1卷第14集 讲到 VAR 变量名=表[列] 指当前行的单元格
// 每次都筛选小于当前行日期,等于当前行姓名的表,判断表是不是0行,是0行就是首次购买
// 以2020年2月1日 丁智敏为例,小于2020/2/1且姓名是丁智敏的表有一行是2020/1/1 丁智敏所以2020年2月1日 丁智敏就不是首次购买了

【度量值】
现在每个月份的首次购买人数就

如果是计算新客户消费金额:
方法二:将新建列写在度量值里面,避开日期表
// 使用日期表也没关系,可以参考权威指南就是改一下表名和字段名
【添加列】
我们为订单表添加列,《DAX神功》第1卷第14回 EARLIER函数
筛选与当前行姓名单元格相同的姓名,计算这个姓名日期列的最小日期
例如,筛选所有的李平平,取这张表中最小日期

【新建表】使用SUMMARIZE也可以

以上新建列+新建表公式,我们完全可以写成一个步骤:【新建表】
如果想计算每个月有多少客户?【度量值】

计算新客户数量:【度量值】

很多人不理解:'tb1'[首次日期] in values('订单表'[日期]) 是什么意思
新客户数量1=countrows(FILTER(tb1,'tb1'[首次日期] in values('订单表'[日期])))
可以理解为
新客户数量1=countrows(tb1筛选后的表)
我们只需要分析tb1筛选后的表
values('订单表'[日期]) 取订单表中日期列去重后生成的表,这张表放到矩阵上就会被行标题筛选

FILTER(tb1,'tb1'[首次日期] in values('订单表'[日期]))
// Filter是行上下文,逐行扫描

Ps:上图只是方便你理解的逻辑图
我们现在的写法:
【新建表】tb1=ADDCOLUMNS(VALUES('订单表'[姓名]),"首次日期",CALCULATE(MIN('订单表'[日期])))
【度量值】新客户数量1=countrows(FILTER(tb1,'tb1'[首次日期] in values('订单表'[日期])))
如果将上面两步合并成一个度量值:
好吧,你现在得到了一个错误的结果,它返回的是每个月的客户数,而不是新客户数

出现这个问题的原因:度量值【新客户数量1】中的tb1是单独生成的表,而度量值【新客户数量2】中的tb01是写在这个度量值中的变量。
行标题只能筛选这个度量值,不能筛选这个度量值引用的外部表。但是您将新建表写在变量中,它就能筛选了。
打个比方:你与孙兴华都喝酒了,只有你在开车,孙兴华是坐车的,被交警查到,只抓你。这时的孙兴华就是tb1外部表
但是,如果你和孙兴华都喝酒了,你们两个人你开一公里,孙兴华开一公里,那被查到就都抓了。这时的孙兴华就是tb01变量生成的表
刚才我们通过举例证明了,我们需要的是行上下文,你筛选就相当于将行上下文转换成筛选上下文。就得不到我们下面想要的结果了,我们需要的是逐行迭代。如下图所示

如果你喝酒了,不想连带孙兴华,那就不要让孙兴华开车。删除孙兴华筛选。
友情提示:现实生活中,喝酒不开车!道路千万条,安全第一条,行车不规范,亲人两行泪
calculatetable(孙兴华,ALL('订单表')) //这样就删除了孙兴华的筛选功能。
所以度量值应该写成:

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