https://zhuanlan.zhihu.com/p/64999937
經常碰到本年至今、本月至今的數據計算,其實還有一類計算是,從歷史最早日期至今的累計計算,比如從開業到現在總共賣出了多少件商品,累計實現了多少銷售額等。
本年累計稱為YTD,歷史至今的累計是不是可以稱為HTD呢:) ;這樣的時間段很可能是跨年的,所以時間智能函數並不適用,不過不用時間智能函數依然可以很簡單的進行計算。
模擬數據如下:
只是計算一個整體累計銷售額很簡單,我們想要計算的是從最初到任意一個日期的累計銷售額,為了能一次計算出各種粒度的歷史至今,可以先構造一個日期表並建立關系。(參考:玩PowerBI必備的日期表制作方式匯總)
然后寫個度量值,
歷史至今 累計收入 =
CALCULATE(
SUM('訂單表'[銷售額]),
FILTER(
ALL('日期表'),
'日期表'[日期]<=MAX('日期表'[日期])))
然后在矩陣中看看結果,
結果正是歷史所有訂單的累計銷售額,這個度量值的關鍵是用MAX函數獲取當前上下文的日期,然后返回小於等於當前日期的所有銷售額的合計。
這個度量值寫法有一個問題,就是它把日期表中所有的日期都計算了一遍,其實大於最后一個訂單日期的無須計算,因為結果並不會發生變化。
為了解決這個問題,可以先把最后一個訂單日期找出來:
訂單最大日期 = MAXX(ALL('訂單表'),'訂單表'[訂單日期])
然后在歷史累計中增加個判斷條件,
歷史至今 累計收入 優化 =
IF(
MIN('日期表'[日期])<=[訂單最大日期],
CALCULATE(
SUM('訂單表'[銷售額]),
FILTER(
ALL('日期表'),
'日期表'[日期]<=MAX('日期表'[日期]))))
再來看一下結果,
正是期望的效果。
歷史至今的聚合計算,不一定只是累計求和,還可以找出歷史上最大的訂單金額,或者歷史至今的平均訂單金額,這些情況只需要改一下聚合函數就行了,比如平均訂單金額就是把SUM改成AVERAGE,
歷史至今 平均訂單訂單 =
IF(
MIN('日期表'[日期])<=[訂單最大日期],
CALCULATE(
AVERAGE('訂單表'[銷售額]),
FILTER(
ALL('日期表'),
'日期表'[日期]<=MAX('日期表'[日期]))))
最大最小訂單同理,不再一一列出,結果如下: