DAX/PowerBI系列 - 關於時間系列 - 時間相關數值比較 - 用非自帶函數


DAX/PowerBI系列 - 關於時間系列 - 時間相關數值比較 - 用非自帶函數

 文末有彩蛋,解決蛋疼問題

難度: ★☆☆☆(2星)

適用范圍: ★(3星)

 

概況:

基於時間的匯總可能是最基礎、最普遍用到的計算之一:計算年度銷售總額,計算月度消費金額,某個店某個時期的銷售情況等等。
這里的時間模式介紹用DAX實現時間相關的計算,它不依賴於DAX自帶的時間函數(譬如YTD,MTD等等)。
如果你有特殊的日歷,特定特定時間段的計算(例如:按周計算、按trimester計算),用這個這個模式都能夠解決。

此文涉及前文DAX/PowerBI系列 - 參數表(Parameter Table) - 多時間段數值對比的擴展部分,給出具體實例和解決方法。
日期維度表參見:如何生成日期維度表

應用場景:

以下是幾個應用場景:

• 計算年底銷售總額
• 計算月度流量總額
• 進一步計算同比,環比

 

最終PowerBI效果顯示如下(耐心等待PowerBI 出來,噔噔噔噔~~~)

 

 https://app.powerbi.com/view?r=eyJrIjoiYzZlYzgxYzItZTA1ZC00ODVmLTlkNjUtZGRlYjdlMDFjOWNlIiwidCI6ImQxYWY4NDdiLTJjZTEtNDRjYi1iYjUwLWQ1ODAyYmI0M2M4YiIsImMiOjEwfQ%3D%3D

 

歡迎轉載,請保留原文鏈接和作者信息。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 )
RETURN CALCULATE ( [Amount], FILTER ( ALL ( 'Date' ), 'Date'[Year] = MAX ( 'Date'[Year] ) && 'Date'[Date] <= MAX ( 'Date'[Date] ) ), dateRng )

 

  

 

 

 

 

 

 


最終效果

參照 上文的PowerBI顯示。

 

Time-Pattern,日期度量值對比,度量值匯總, 同比,環比,YoY, MoM,庫存對比,年度環比,月度環比


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM