Power BI之DAX神功:答網友問08 嵌套使用時間智能函數
一、網友提問

答:問題我給您講,被踢群的事沒有辦法。建議您看一下林志穎、金城武、還有心如姐姐主演的電影《學校霸王》,他演的是學校,同時也映射了當時和未來的全球社會。最終告訴我們一個道理,只有自己強大,才會被尊重。
二、大多數時間智能日期函數第1參數可以使用只有日期列的表

因為大多數時間智能日期函數第1參數是日期列,但是,也可以是一個只有日期列的表。如下圖所示:表原本有兩列,我們需要將日期列生成一個表

將一列變成一個表:首先應該想到的是VALUES與DISTINCT函數
VALUES與DISTINCT函數的區(qū)別:
詳見《DAX神功》第1卷第9回 基礎表函數之VALUES與DISTINCT函數和空行?
以下三個度量值,結果是等價的:
年初至今1 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD('Sheet1'[日期]))?
年初至今2 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(VALUES('Sheet1'[日期])))
年初至今3 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(DISTINCT('Sheet1'[日期])))

如果我們想鎖定2021年,我們之前的方法是:
年初至今1 = CALCULATE(CALCULATE(SUM(Sheet1[銷售]),DATESYTD('Sheet1'[日期])),'Sheet1'[日期]>date(2020,12,31))
年初至今2 = CALCULATE(CALCULATE(SUM(Sheet1[銷售]),DATESYTD(VALUES('Sheet1'[日期]))),'Sheet1'[日期]>date(2020,12,31))
年初至今3 = CALCULATE(CALCULATE(SUM(Sheet1[銷售]),DATESYTD(DISTINCT('Sheet1'[日期]))),'Sheet1'[日期]>date(2020,12,31))

既然,時間智能函數第1參數可以是一張只有日期列的日期表,我們可以篩選這張表呀?而不用再去套上一個Calculate去篩選內層的calculate
詳見《DAX神功》第1卷第18回 Calculate復雜的篩選條件? 我證明的calculate嵌套也可以是從內向外計算
CALCULATETABLE函數:詳見《火力全開》筆記04
語法:Calculatetable(表,篩選條件)
年初至今1 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD('Sheet1'[日期]))?
年初至今2 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(CALCULATETABLE(VALUES('Sheet1'[日期]))))
年初至今3 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(CALCULATETABLE(DISTINCT('Sheet1'[日期]))))
CALCULATETABLE單獨擺看不出來有什么用處,它的意義在于篩選表:

例如:只看2021年
年初至今1 = CALCULATE(CALCULATE(SUM(Sheet1[銷售]),DATESYTD('Sheet1'[日期])),'Sheet1'[日期] > date(2020,12,31))?
年初至今2 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(CALCULATETABLE(VALUES('Sheet1'[日期]),'Sheet1'[日期] > date(2020,12,31))))
年初至今3 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(CALCULATETABLE(DISTINCT('Sheet1'[日期]),'Sheet1'[日期] > date(2020,12,31))))

三、其實時間智能日期函數也返回一張表
時間智能日期函數也返回一張表,同樣可以做另一個時間智能日期函數的參數,這個問題我們在前面3節(jié)課中已經證明過了。
例如:Datesytd和Sameperiodlastyear函數


以下表為例:

表1=DATESYTD('Sheet1'[日期])?

表2 = SAMEPERIODLASTYEAR(DATESYTD('Sheet1'[日期]))?
Ps: 其實就等同于:根據本期找到同期

表3 = SAMEPERIODLASTYEAR('Sheet1'[日期])?

表4 = DATESYTD(SAMEPERIODLASTYEAR('Sheet1'[日期]))?
Ps: 今年以前的全部數據中,獲取年初至今就是今年的同期數據

所以,表2和表4做calculate的篩選器結果是相同的
同比1 = CALCULATE(SUM(Sheet1[銷售]),SAMEPERIODLASTYEAR(DATESYTD('Sheet1'[日期])))
同比2 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD(SAMEPERIODLASTYEAR('Sheet1'[日期])))

四、還有一種更奇葩的嵌套
年初至今 = CALCULATE(SUM(Sheet1[銷售]),DATESYTD('Sheet1'[日期]))
同比3 = CALCULATE([年初至今],SAMEPERIODLASTYEAR('Sheet1'[日期]))
Ps: 先得到年初至今,求年初至今的同期和我們直接求同期的結果是一樣的

同比4 = CALCULATE([同比3],DATESYTD('Sheet1'[日期]))
Ps: 當你用同比3做計算器,年初至今做篩選條件時,同比1=同比3=同比4

總結:這些嵌套理解就可以了,實際工作中如果沒有必要盡量不用,化繁為簡才是王道。
勸:三思而后行!但是:相離莫相忘,且行且珍惜

《孫興華講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等等
https://www.bilibili.com/read/cv10222110