Power BI之DAX神功:第2卷第12回 計算同比與環(huán)比
《火力全開》筆記27.時間智能日期函數(shù)中已經(jīng)對SAMEPERIODLASTYEAR函數(shù)與DATEADD函數(shù)已經(jīng)做過詳細解釋,今天我們主要來處理一下,網(wǎng)友在實際中遇到的問題。
一、SAMEPERIODLASTYEAR函數(shù)【同比】
語法:SAMEPERIODLASTYEAR(日期列)? ?//返回一年以前的同一組日期

如上表所示,最大日期是2021年3月1日
本期(今年):2021/1/1~2021/3/1
同期(去年):2020/1/1~2020/3/1
1.測試
【新建表】表1 = SAMEPERIODLASTYEAR('Sheet1'[日期])
// 這樣就可以得到同比的日期

【度量值】同期 = CALCULATE(SUM(Sheet1[銷售]),SAMEPERIODLASTYEAR('Sheet1'[日期]))

2.回答網(wǎng)友問題

現(xiàn)在我來回答你的問題:

【新建表】表2 = SAMEPERIODLASTYEAR('Sheet1'[日期])

問題就出現(xiàn)在這里,SAMEPERIODLASTYEAR產(chǎn)生的表并不是2020/1/1~2020/3/1的
處理方法如下:
【新建表】表2 = FILTER(SAMEPERIODLASTYEAR('Sheet1'[日期]),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31))
//篩選SAMEPERIODLASTYEAR生成的表中日期大于最大年減2那一年12月31日以后的數(shù)據(jù),最大日期是2021/3/1,這一年是2021年,2021-2=2019年,2019年12月31日以后的數(shù)據(jù)就是2020/1/1~2020/3/1


3.日期有重復怎么辦?
不受影響!《火力全開》中我們已經(jīng)鑒定過了。只有早期版本受限,需要使用VALUES或DISTINCT函數(shù)對多端表日期列去重,目前的PowerBI版本是無需這個步驟的。
據(jù)了解:從PowerBI于2020.4月版本取消了這個限制
問:是不是我就不需要新建日期表了?
答:依據(jù)個人需求而定!假設你想在矩陣行標題上寫星期,日期表還是更方便一些。
4.特殊需求:今年截止目前的數(shù)據(jù)對比去年全部數(shù)據(jù)

如上圖所示,本期是2021/1/1~2021/3/1,同期應該是2020/1/1~2020/3/1
但是,特殊需求,我要使用本期數(shù)據(jù)與同期全年數(shù)據(jù)進行對比
關于網(wǎng)上流傳的利用EDATE函數(shù)和輔助列方式,并不萬能,他的案例可以,換個案例就失效了:
Ps:?EDATE函數(shù)在《火力全開》筆記19.3講過
【新建列】列 = 'Sheet1'[日期]<=EDATE(MAX ('Sheet1'[日期]), -12 ) && 'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31)

很明顯,這并不是我們要的結果。
【新建列】列 = 'Sheet1'[日期]<date(year(max('Sheet1'[日期])),1,1) && 'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31)
// 我的方法看似爆弱,但是安全且萬能!新建列是行上下文,逐行掃描,小于最大日期所在年的1月1日,且,大于最大日期所在年減掉2年的12月31日的數(shù)據(jù)。是不是最簡單的數(shù)學知識!

【度量值】 同期 = CALCULATE(SUM(Sheet1[銷售]),FILTER('Sheet1','Sheet1'[列]=True))

5.同期會算了,本期怎么算?
上節(jié)課講的年初至今TOTALYTD和DATESYTD這么快就忘記了?

以上處理問題的方法同樣適用于下面這個函數(shù):
二、更靈活的DATEADD函數(shù)(既可以環(huán)比,又可以同比)
DATEADD函數(shù)靈活在哪里?同比和環(huán)比皆可計算!
語法:DATEADD ( <日期列>, <偏移量>, <偏移單位> )

以下表為例:

【新建表】表3 = dateadd('Sheet1'[日期],-1,YEAR)

// 存在同樣的問題,我們使用同樣的方法優(yōu)化
【新建表】表4=FILTER(dateadd('Sheet1'[日期],-1,YEAR),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31))

更靈活的DATEADD體現(xiàn)在兩個方面:
1.特殊情況下的案例
假設:2020年因特殊原因,有好幾個月處于三天打魚兩天曬網(wǎng)的狀態(tài),銷售慘淡,不便做為同比數(shù)據(jù),那就與2019年同期做對比。這就是特殊情況!
本期:2021/1/1~2021/3/1
同期:2019/1/1~2019/3/1
如果我們使用SAMEPERIODLASTYEAR函數(shù):顯然得到的日期是錯誤的!
【新建表】表3 = FILTER(SAMEPERIODLASTYEAR('Sheet1'[日期]),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-3,12,31) && 'Sheet1'[日期]<date(year(max('Sheet1'[日期]))-1,1,1))

原理:SAMEPERIODLASTYEAR函數(shù)是返回日期列最大日期所在年,上一年的同期數(shù)據(jù),但是在去年以前的數(shù)據(jù)都是完整的,而不是同期的。
這個時候,可以處理,我們再做月份的判斷,讓這張表的月份小于原表中日期列最大日期的月份,但是這相對就麻煩一些了。
現(xiàn)在我們使用Dateadd函數(shù):
【新建表】表4 = FILTER(dateadd('Sheet1'[日期],-2,YEAR),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-3,12,31))

Ps: 我已經(jīng)提前告訴大家了,這是在特殊情況下的案例,不是每一年都像2020年那樣不平凡。
2.除了年,我們還可以看到季度、月份和天
總銷售=sum(Sheet1[銷售])
上年 = CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1, YEAR ))
上月 = CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1, MONTH )))
上季 = CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1, Quarter))
上一天?= CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1,?Day))
現(xiàn)在,我們以“上月”為例:
【度量值】上月 = CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1, MONTH )))
// 沒有上個月的數(shù)據(jù)肯定是Blank()

很多人做到這一步,不知道怎么算環(huán)比,詳見《DAX神功》第1卷第4回
【度量值】環(huán)比 = if([上月]=BLANK(),BLANK(),DIVIDE([總銷售],[上月])-1)

Ps:關于總計顯示為空的問題已經(jīng)老生常談了,不再贅述。
3.回答網(wǎng)友問題,我只想顯示2021年的環(huán)比
我們以前學過那么多知識,你隨便拿出一樣來就能解決
【度量值】上月 = CALCULATE(CALCULATE([總銷售],DATEADD('Sheet1'[日期], -1, MONTH )),KEEPFILTERS('Sheet1'[日期]>date(2020,12,31)))

為什么2018/1/1~2020/4/1還顯示在矩陣中?

你將矩陣列標題中的【銷售】去掉就OK了

三、除了Calculate之外,TOTAL系列也可以實現(xiàn)同比和環(huán)比計算
上節(jié)課告訴大家,我更習慣用后者
【度量值】今年 = TOTALYTD(sum('Sheet1'[銷售]),'Sheet1'[日期])?
【度量值】去年 = TOTALYTD(SUM(Sheet1[銷售]),FILTER(dateadd('Sheet1'[日期],-1,YEAR),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31)))
上述方法,我們計算的是同比,如果是環(huán)比呢?修改Dateadd的第3參數(shù),修改Total系列函數(shù)名。

特別提示:
關于SAMEPERIODLASTYEAR和DATEADD函數(shù)你還有什么問題,發(fā)稿后3天之內私信我。
我方便出答網(wǎng)友問的文章,時間久了,您的問題與《DAX神功》不具有連續(xù)性時
您的問題就會等到下次講PowerBI時再回答了。。。也許就是2022年了。。。
抓緊時間哦!

《孫興華講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