數據可視化之DAX篇(九) 關於DAX中的VAR,你應該避免的一個常見錯誤


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的使用示例:

 

所以官方的資料中也會有失誤的情況,而我之前的文章中(學會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的理解又加深了一層呢。


免責聲明!

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



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