DAX/PowerBI系列 - 關於時間系列 - 時間相關數值比較 - 用非自帶函數
文末有彩蛋,解決蛋疼問題
難度: ★★☆☆☆(2星)
適用范圍: ★★★☆☆(3星)
概況:
基於時間的匯總可能是最基礎、最普遍用到的計算之一:計算年度銷售總額,計算月度消費金額,某個店某個時期的銷售情況等等。
這里的時間模式介紹用DAX實現時間相關的計算,它不依賴於DAX自帶的時間函數(譬如YTD,MTD等等)。
如果你有特殊的日歷,特定特定時間段的計算(例如:按周計算、按trimester計算),用這個這個模式都能夠解決。
此文涉及前文DAX/PowerBI系列 - 參數表(Parameter Table) - 多時間段數值對比的擴展部分,給出具體實例和解決方法。
日期維度表參見:如何生成日期維度表
應用場景:
以下是幾個應用場景:
• 計算年底銷售總額
• 計算月度流量總額
• 進一步計算同比,環比
最終PowerBI效果顯示如下:(耐心等待PowerBI 出來,噔噔噔噔~~~)

歡迎轉載,請保留原文鏈接和作者信息。O(∩_∩)O謝謝。
DAX/PowerBI系列 - 參數表(Parameter Table) 度量值模板(Period Table)
作者:馬丁叔叔 鏈接:http://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-Parameter-Table-Period-Table-Extension.html
數據模型:
Date(日期表)
Product(產品表)
Sales (銷售表)
Inventory(庫存表)

要點:
首先定義一個度量值(measure),它基於銷售額列(SalesAmount),(注:銷售額(SalesAmount)此列是數據表中的列,不是度量值)
有些盆友覺得定義這個度量值是多余的,但是細看下面你就會發現這樣定義是十分有用的: 1. 易懂 2. 簡化引用這個度量值的其他度量值 3. 易於維護
度量值 Amount
[Amount] := SUM(Sales[SalesAmount])
月初至今 MTD
[Amount MTD] := CALCULATE ( [Amount], FILTER ( ALL ( 'Date' ), 'Date'[Year] = MAX ( 'Date'[Year] ) && 'Date'[Month] = MAX ( 'Date'[Month] ) && 'Date'[Date] <= MAX ( 'Date'[Date] ) ) )
月初至今(上月) LMTD
[Amount LMTD] := VAR maxSalesDate = MAX ( 'Sales 0'[skDate] ) VAR dateRng = FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate ) RETURN CALCULATE ( [Amount MTD], DATEADD ( 'Date'[Date], -1, MONTH ), dateRng )
dateRng: 見文末詳解。
月初至今(去年) LYMTD
1 [Amount LYMTD] := 2 VAR maxSalesDate = 3 MAX ( 'Sales 0'[skDate] ) 4 VAR dateRng = 5 FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate ) 6 RETURN 7 CALCULATE ( [Amount MTD], DATEADD ( 'Date'[Date], -1, YEAR ), dateRng )
月度環比 MoM
1 [MoM] := 2 IF ( 3 [Amount MTD] <> BLANK (), 4 DIVIDE ( [Amount MTD] - [Amount LMTD], [Amount LMTD] ) 5 )
月度同比 LMoM
[LMoM] := IF ( [Amount MTD] <> BLANK (), DIVIDE ( [Amount MTD] - [Amount LYMTD], [Amount LYMTD] ) )
年初至今 YTD
[Sales YTD] := CALCULATE ( [Amount], FILTER ( ALL ( 'Date' ), 'Date'[Year] = MAX ( 'Date'[Year] ) && 'Date'[Date] <= MAX ( 'Date'[Date] ) ) )
年初至今(去年) LYTD
[Amount LYTD] := VAR maxSalesDate = MAX ( 'Sales 0'[skDate] ) VAR dateRng = FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate ) RETURN CALCULATE ( [Amount YTD], DATEADD ( 'Date'[Date], -1, YEAR ), dateRng )
年同比 YoY
[YoY] := IF ( [Amount YTD] <> BLANK (), DIVIDE ( [Amount YTD] - [Amount LYTD], [Amount LYTD] ) )
^如何在圖表中顯示LYTD,LMTD的數據
一般來說日期表(Date)中含有的未來的月份,譬如未來5年的日期,或者事實表(Fact)中沒有的日期,為了防止圖表中顯示出來LMTD,LYTD之類的,用這個篩選日期達到目的。
例子:在事實表(Fact)中,最大的交易日期是2013-06-13。
如圖:
左邊因為2014年計算LYTD的時候不為空,所以X軸顯示到了2014年到6月份,但是用最大的交易日期篩選后,就可以正常顯示了。
| 沒有用dateRng篩選 | 用dateRng篩選 |
[x Amount YTD] := CALCULATE ( [Amount], FILTER ( ALL ( 'Date' ), 'Date'[Year] = MAX ( 'Date'[Year] ) && 'Date'[Date] <= MAX ( 'Date'[Date] ) ) )
|
[Amount YTD] := VAR maxSalesDate = MAX ( 'Sales 0'[skDate] ) VAR dateRng = FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate )
|
|
|
|
最終效果
參照 上文的PowerBI顯示。
Time-Pattern,日期度量值對比,度量值匯總, 同比,環比,YoY, MoM,庫存對比,年度環比,月度環比

