https://zhuanlan.zhihu.com/p/67803111
本文源於微博上一位朋友的問題,在計算同比增長率時,以下兩種DAX代碼有什么不同?
--------------------
YOY% 1 =
VAR sales=SUM('訂單'[銷售額])
VAR lysales=
CALCULATE(
SUM('訂單'[銷售額]),
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN DIVIDE(sales-lysales,lysales)
--------------------
--------------------
YOY% 2 =
VAR sales=SUM('訂單'[銷售額])
VAR lysales=
CALCULATE(
sales,
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN DIVIDE(sales-lysales,lysales)
--------------------
這兩種方式,只是在計算上年銷售額lysales時,CALCULATE的第一個參數有區別,第一種方式是使用SUM('訂單'[銷售額]),而第二種方式是利用了上一步VAR定義好的sales來進行運算。
你可以先思考一下,上述兩種方式哪一種可以返回期望的結果呢?
將這兩個度量值放進矩陣中看看結果,
因為2016年沒有上年數據,所以YOY%1 2016年的結果為空,也屬正常,2017年正常計算出結果。
但是YOY%2 的每個值都是零,為什么是這個結果呢?
並且這種寫法還是參考了微軟官方文檔中VAR的使用示例:
https://docs.microsoft.com/zh-cn/dax/var-dax
所以官方的資料中也會有失誤的情況,而我之前的文章中(學會VAR,你就離掌握DAX更近了一步)也介紹了這個寫法,當時沒有細想,也沒有實際驗證,現在看來,也是很有問題的,這里給大家道個歉。
第二種寫法到底有什么問題呢?
還是要回到VAR的特征,它定義的是一個變量,但是它一旦定義完成,在當前的計算中就變成了一個固定值,不會再發生變化,所以在計算lysales時,無論是否有 SAMEPERIODLASTYEAR的條件,它都會等於sales,因此導致結果都等於0。
如果還不明白,我們可以再分別驗證一下sales和lysales的結果,
再建兩個度量值:
--------------------
sales =
VAR sales=SUM('訂單'[銷售額])
RETURN sales
--------------------
--------------------
lysales =
VAR sales=SUM('訂單'[銷售額])
VAR lysales=
CALCULATE(
sales,
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN lysales
--------------------
結果如下,
lysales的計算結果和sales完全一樣!
以2017年為例,VAR定義的變量sales的結果是1666736,在計算lysales時,就變成了:
CALCULATE(
1666736,
SAMEPERIODLASTYEAR('日期表'[日期]))
結果當然還是1666736.
如何解決這個問題呢,就是使用本文開頭的第一種寫法,定義的sales和lysales都要獨立根據上下文運算,分別得出正確的結果以后,再進行增長率運算。
通過這個例子,是不是對VAR的理解又加深了一層呢。