如何在 PowerBI 中快速調(diào)試上百行 DAX 公式
作為剛剛開始寫 DAX 公式的小伙伴,會遇到一個非常明顯的問題,那就是:我怎么知道我的 DAX 公式在某一步算出來了什么。
DAX 公式的特點
DAX 公式是可以嵌套的,且中間是可以產(chǎn)生出表的,但最終以度量值呈現(xiàn)的結(jié)果必須返回值。
也就是說,不論中間步驟產(chǎn)生了多么復雜的表結(jié)構(gòu),最后必須返回一個值。
這就導致很多伙伴希望知道中間過程中的表到底與預期是否一致。
典型的錯誤
來看一個典型的錯誤信息:

Power BI 的錯誤信息并不友好,真不知道產(chǎn)品經(jīng)理是怎么想的,一旦出現(xiàn)錯誤就給出一個恐怖的差子,而且還就是這么設計的,導致很多伙伴遇到這樣的恐怖信息就望而卻步了。
這里首先要告訴大家的是:不必擔心自己編寫的 DAX 公式,它們不會在本質(zhì)有任何負面破壞性效果,僅僅是無法計算出來結(jié)果而已。
分析錯誤信息
排除錯誤信息的第一步,是要分析錯誤信息,如下:

絕大多數(shù)伙伴遇到這步的第一反應是:
啊,出錯了。啊!哪里錯了?然后就點擊【關閉】了。然后就去思考自己的公式哪里出錯了。
這是不正確的表現(xiàn),因為這個信息非常重要,它可以告訴我們問題是什么,至少可以幫助我們鎖定問題出現(xiàn)的位置。
我們仔細來看下這個信息:
百分位數(shù)值必須介于 xxxx 范圍之間,其中 N 是數(shù)據(jù)值的個數(shù)。
這個信息幾乎可以幫助我們鎖定出現(xiàn)問題的位置是百分位數(shù)的計算位置。
進行調(diào)試
回到 DAX 公式中,大概如下:

不難發(fā)現(xiàn)錯誤是在這里引起的。
很多伙伴看到這么長的公式直接就放棄了,但是的確可以進行調(diào)試。而不需要借助復雜的工具。
首先來確定是不是這個公式引起的,可以替換為一個特征值,如:9999999。如下:

效果如下:

可以看出:此時的錯誤消除了,而返回了特征值,說明:定位的錯誤位置是正確的。
接下來,就是要分析這個錯誤到底是為什么了。
這時候的技巧在于三點:
【技巧一】再次審視錯誤信息。
【技巧二】看函數(shù)中涉及的中間表數(shù)據(jù)。
【技巧三】分析函數(shù)的執(zhí)行過程。(可能涉及到上下文轉(zhuǎn)換)
如果可以同時考慮到上述三點,幾乎 80% 的錯誤就可以被分析出來。我們來試一試。
先來看【技巧一】錯誤信息:
百分位數(shù)值必須介于 1/(N+1) ... N/(N+1) 范圍之間,其中 N 是數(shù)據(jù)值的個數(shù)。
也就是說,錯誤來自于數(shù)值的范圍不對。我們嘗試代入:
N = 1,則:1/2 ... 1/2
N = 2,則:1/3 ... 2/3
而我們使用的公式是:
PERCENTILEX.EXC( SoldDaysList , [已售在庫天數(shù)] , 0.75 )這個公式中用到了一個表中的元素 [已售在庫天數(shù)],后面的參數(shù) 0.75 必須介于合理的范圍之間,如果:
N = 1 或 N = 2,都會導致這個公式錯誤,那么 SoldDaysList 的 [已售在庫天數(shù)] 會有多少個元素呢?
我們需要提取 SoldDaysList 的信息,就需要【技巧二】了,如下:

得到:

這個元素的確很多,還可以看到:

這個元素只有一個,因此正好命中了錯誤信息的含義。
我們找到了問題所在。
調(diào)整公式如下:

返回的結(jié)果不再報錯。問題得解。
當然,如果這個語義不合理,可以進一步調(diào)整公式。但已經(jīng)至少排除了錯誤本身。
總結(jié)
DAX 公式的調(diào)試的確是一個問題,這里給出了不依賴任何第三方工具,完全依靠邏輯上的分析以及 CONCATENATEX 這個既具技巧的函數(shù)來返回中間表內(nèi)容結(jié)果以便排除問題的過程。

與精英一起討論 Power BI,驗證碼:data2022
點擊“閱讀原文”進入學習中心
↙
