Power BI之DAX神功:第2卷第14回 半累加計算就是日期維度最大日期對應(yīng)的值
一、理解半累加計算

假設(shè):我是賣西瓜的,每天都有進貨和銷售,每天也會剩下一些瓜。
Sheet1這張表是我以每月第1天與最后一天為例,中間日期省略
1月份我剩余西瓜的數(shù)量,應(yīng)該是2
第1季度剩余瓜的數(shù)量,應(yīng)該是6
總之,日期維度中最后一天的庫存就是我的結(jié)余庫存。
神仙們給它起了一個名字:半累加計算
從來就沒有什么救世主,也不靠神仙皇帝!
要創(chuàng)造人類的幸福,全靠我們自己!
來源于《國際歌》
我們將Sheet1的字段放到矩陣上:

這樣做結(jié)果全是錯的,它是將日期維度的值求和了,如果是計算銷售數(shù)量或金額那是正確的
現(xiàn)在我們只需要每個維度最后一個日期的值。
二、LastDate函數(shù)
返回日期列的最大日期(只有一行一列的表)
這里的日期列,也可以是另一個時間智能函數(shù)生成的只有日期列的表。
詳見《DAX神功》答網(wǎng)友問08 嵌套使用時間智能函數(shù)?
【新建表】表 = LASTDATE('Sheet1'[日期])

【度量值】總庫存 = sum(Sheet1[庫存])
【度量值】最后一天的庫存 = CALCULATE([總庫存],LASTDATE('Sheet1'[日期]))

正常人其實都是這樣寫的,什么情況下是不正常呢?
例如:起床不洗漱,做飯不洗菜,吃飯不洗手.....
現(xiàn)實中,很多做數(shù)據(jù)分析的人有類似上述行為,但他并不是高手,他處處遇坑,爬起來繼續(xù)摔。他們信仰:“酒肉穿腸過 ,佛祖心中留, 世人若學我,如同進魔道。” 出自《濟公李修緣》
電視劇中的濟公也不洗手,但他不會得病,你學他,你可能會住院。世人對濟公的話只聽前半句,不聽后半句。所以他們研究復(fù)雜的DAX原理,而不進行數(shù)據(jù)清洗。
三、世人若學他,原理走一波
我們將Sheet1表2021/1/31的庫存清空,現(xiàn)實中這一天我忘記盤點了,那么他應(yīng)該取2021/1/31最近的一個日期,在我們表上是2021/1/1的庫存值。

遇到這張表的情況,有1月份的最大日期,但是最大日期對應(yīng)的值為空。
【度量值】總庫存 = sum(Sheet2[庫存])
【度量值】最后一天的庫存 = CALCULATE([總庫存],LASTDATE('Sheet2'[日期]))
結(jié)果就變成了下面這樣:

如果你將表導(dǎo)入PowerBI時先到PowerQuery中數(shù)據(jù)清洗過濾掉庫存為空的行,就沒有下面的問題了。
如果你沒有洗菜,你炒菜時,發(fā)現(xiàn)菜里面有一個蝸牛或者有一只蚯蚓。
解決辦法是什么:把它們撿出來扔掉。否則就是洗菜。
你不洗,你研究原理,那么我們就講講把蝸牛和蚯蚓扔掉的方法。
Ps: 方法并不唯一!
【新建表】表 = FILTER('Sheet2','Sheet2'[庫存]<>BLANK())

建立虛線關(guān)系
詳見《DAX神功第1卷第21回》Calculate調(diào)節(jié)器USERELATIONSHIP函數(shù)

【度量值】非空最后一天庫存 = CALCULATE([總庫存],LASTDATE('表'[日期]),USERELATIONSHIP('Sheet2'[日期],'表'[日期]))

友情提示:其實真的沒有這么麻煩,因為你們還沒有學習數(shù)據(jù)沿襲,《DAX神功》第2卷第22回學完以后,你就可以使用數(shù)據(jù)沿襲的方法來解決這個問題
四、當你使用日期表時,會有另一種情況
我將2021/1/31日刪除,得到下面這張表:2021/1/1我盤點時發(fā)現(xiàn)了還有1個西瓜,后來我又發(fā)現(xiàn)被劉華強劈了一個瓜,瓜還在,明天打上保鮮膜接著賣成西瓜切:)所以2021/1/1西瓜共2個庫存

第一步:創(chuàng)建日期表
日期表 = ADDCOLUMNS(
CALENDAR(FIRSTDATE('Sheet1'[日期]),LASTDATE('Sheet1'[日期])),
"年", YEAR ( [Date] ),
"季度", ROUNDUP(MONTH([Date])/3,0),
"月", MONTH([Date]),
"周", weeknum([Date]),
"年季度", year([date]) & "Q" & ROUNDUP(MONTH([Date])/3,0),
"年月", year([Date]) * 100 + MONTH([Date]),
"年周", year([Date]) * 100 + weeknum([Date]),
"星期幾", WEEKDAY([Date])
)
大家應(yīng)該知道,日期表產(chǎn)生的是2021/1/1~2021/10/31連續(xù)日期的數(shù)據(jù)
第二步:建立關(guān)系

第三步:寫度量值
【度量值】總庫存 = sum(Sheet1[庫存])
【度量值】最后一天的庫存 = CALCULATE([總庫存],LASTDATE('日期表'[Date]))

出現(xiàn)這個問題的原因:日期表中1月的最大日期是2021/1/31,因為我們使用的LASTDATE('日期表'[Date])。但是2021/1/31并沒有庫存,所以這里顯示為空。
解決方案:
===《The Definitive Guide to DAX》中建議寫法===
【度量值】書中方案 = CALCULATE([總庫存],LASTNONBLANK('日期表'[Date],COUNTROWS(RELATEDTABLE(Sheet1))))
原理:LASTNONBLANK掃描第1參數(shù)那個表的日期列,并返回第2參數(shù)不為空時所對應(yīng)表的最后一個值。
===我的方案===
【度量值】我的方案 = CALCULATE([總庫存],LASTDATE('Sheet1'[日期]))
原理:找到Sheet1表日期列的日期維度最大值

五、換成多商品的表格

我們?nèi)匀皇褂脛偛诺亩攘恐?/p>
所以,《The Definitive Guide to DAX》關(guān)于本節(jié)最后兩個度量值,我是用不到的,您可以做為學習研究,我可以用上述方式實現(xiàn),就沒必要使用復(fù)雜方式處理了。

《孫興華講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函數(shù))、PowerQuery(M函數(shù))、Python辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110?