Power BI之DAX神功:第3卷第10回 計(jì)算新客戶 方法與原理
關(guān)于《The Definitive Guide to DAX》本章節(jié):將銷售額的計(jì)算范圍縮小至首年客戶與之前有一個(gè)計(jì)算從未購買某些產(chǎn)品的客戶數(shù)量,這兩個(gè)案例,我們放到《DAX神功》第3卷末精講ALLSELECTED時(shí)再分析,我不習(xí)慣使用還沒有講過的知識(shí)來講解。
方法一:簡(jiǎn)單粗暴
// 推薦這種方法:新增列會(huì)占用內(nèi)存,請(qǐng)問是內(nèi)存貴,還是植發(fā)貴?你較勁腦汁掉的頭發(fā),想恢復(fù)頭發(fā)的數(shù)量估計(jì):30T內(nèi)存=1次植發(fā)。話出回來真的會(huì)占用內(nèi)存嗎?我看未必,你新建一個(gè)日期表,比我新建一個(gè)列一定省內(nèi)存嗎?不絕對(duì)吧?新建日期表目的只是為了獲取更多維度,如果沒有這個(gè)需求,我覺得沒有必要新建日期表。
課件來自:《跟著孫興華學(xué)習(xí)數(shù)據(jù)分析?第一季?銷售篇》第8集??
文件名:08.計(jì)算新客戶數(shù)量.xlsx

【新建列】
// 《DAX神功》第1卷第14集 講到 VAR 變量名=表[列]? ?指當(dāng)前行的單元格
// 每次都篩選小于當(dāng)前行日期,等于當(dāng)前行姓名的表,判斷表是不是0行,是0行就是首次購買
// 以2020年2月1日 丁智敏為例,小于2020/2/1且姓名是丁智敏的表有一行是2020/1/1?丁智敏所以2020年2月1日?丁智敏就不是首次購買了

【度量值】
現(xiàn)在每個(gè)月份的首次購買人數(shù)就

如果是計(jì)算新客戶消費(fèi)金額:
方法二:將新建列寫在度量值里面,避開日期表
// 使用日期表也沒關(guān)系,可以參考權(quán)威指南就是改一下表名和字段名
【添加列】
我們?yōu)橛唵伪硖砑恿校?span id="s0sssss00s" class="color-green-04">《DAX神功》第1卷第14回 EARLIER函數(shù)
篩選與當(dāng)前行姓名單元格相同的姓名,計(jì)算這個(gè)姓名日期列的最小日期
例如,篩選所有的李平平,取這張表中最小日期

【新建表】使用SUMMARIZE也可以

以上新建列+新建表公式,我們完全可以寫成一個(gè)步驟:【新建表】
如果想計(jì)算每個(gè)月有多少客戶?【度量值】

計(jì)算新客戶數(shù)量:【度量值】

很多人不理解:'tb1'[首次日期] in values('訂單表'[日期]) 是什么意思
新客戶數(shù)量1=countrows(FILTER(tb1,'tb1'[首次日期] in values('訂單表'[日期])))
可以理解為
新客戶數(shù)量1=countrows(tb1篩選后的表)
我們只需要分析tb1篩選后的表
values('訂單表'[日期]) 取訂單表中日期列去重后生成的表,這張表放到矩陣上就會(huì)被行標(biāo)題篩選

FILTER(tb1,'tb1'[首次日期] in?values('訂單表'[日期]))?
// Filter是行上下文,逐行掃描

Ps:上圖只是方便你理解的邏輯圖
我們現(xiàn)在的寫法:
【新建表】tb1=ADDCOLUMNS(VALUES('訂單表'[姓名]),"首次日期",CALCULATE(MIN('訂單表'[日期])))
【度量值】新客戶數(shù)量1=countrows(FILTER(tb1,'tb1'[首次日期] in values('訂單表'[日期])))
如果將上面兩步合并成一個(gè)度量值:
好吧,你現(xiàn)在得到了一個(gè)錯(cuò)誤的結(jié)果,它返回的是每個(gè)月的客戶數(shù),而不是新客戶數(shù)

出現(xiàn)這個(gè)問題的原因:度量值【新客戶數(shù)量1】中的tb1是單獨(dú)生成的表,而度量值【新客戶數(shù)量2】中的tb01是寫在這個(gè)度量值中的變量。
行標(biāo)題只能篩選這個(gè)度量值,不能篩選這個(gè)度量值引用的外部表。但是您將新建表寫在變量中,它就能篩選了。
打個(gè)比方:你與孫興華都喝酒了,只有你在開車,孫興華是坐車的,被交警查到,只抓你。這時(shí)的孫興華就是tb1外部表
但是,如果你和孫興華都喝酒了,你們兩個(gè)人你開一公里,孫興華開一公里,那被查到就都抓了。這時(shí)的孫興華就是tb01變量生成的表
剛才我們通過舉例證明了,我們需要的是行上下文,你篩選就相當(dāng)于將行上下文轉(zhuǎn)換成篩選上下文。就得不到我們下面想要的結(jié)果了,我們需要的是逐行迭代。如下圖所示

如果你喝酒了,不想連帶孫興華,那就不要讓孫興華開車。刪除孫興華篩選。
友情提示:現(xiàn)實(shí)生活中,喝酒不開車!道路千萬條,安全第一條,行車不規(guī)范,親人兩行淚
calculatetable(孫興華,ALL('訂單表'))? //這樣就刪除了孫興華的篩選功能。
所以度量值應(yīng)該寫成:

孫興華講PowerBI火力全開》PowerBI必學(xué)課程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》視頻版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函數(shù))、PowerQuery(M函數(shù))、Python辦公自動(dòng)化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等