https://zhuanlan.zhihu.com/p/68183990
我在知識星球收到的問題中,關於表格和矩陣(以下統稱表格)總計行錯誤算是常見的問題之一了,不少初學者甚為不解,在Excel透視表中很常見的總計,為什么到了更強大的 PowerBI 中,反而會出現這么低級的錯誤呢?
並且碰到這個錯誤,很多人都束手無策,不知道該怎么辦,或者干脆設置為不顯示總計行了,其實沒有必要,本文就來介紹一下為什么會出現錯誤,以及解決的辦法。
總計的計算邏輯
在PowerBI的表格中,每一個數據都是根據當前的上下文計算出來的,包括總計,也就是說,總計是按照總計行的上下文獨立計算的,而不是根據上面的明細相加得來的。
為了理解上面這段話的含義,請看下面的例子。
假設要計算每個產品的訂單數量,根據訂單表中的數據,新建個度量值,
系統訂單數量 = COUNTROWS('訂單')
在矩陣中顯示如下:
計算邏輯比較簡單時,默認情況下總計行的數據是沒問題的。
假設每種產品的訂單中,都有兩個是測試訂單,也就是真實訂單比系統中的訂單數要少兩個,那么真實訂單的度量值如下:
實際訂單數量 = COUNTROWS('訂單')-2
把這個度量值放進來,看看是什么結果,
可以看到每一個產品的實際訂單數量都少了兩個,計算是正確的,但總計行竟然也只少了兩個,明顯與明細數據之和不符!
這就是總計的計算邏輯,它不管上面的明細數據是多少,它只是在匯總的訂單數量的基礎上減去2,於是得到了4624。
理解了這個計算邏輯,下面就來看看如何解決。
總計錯誤的解決方案
既然我們想讓總計等於上面明細之和,那么我們就按照這個邏輯構建一個度量值,
------------------
實際訂單數量1 =
IF(
HASONEVALUE('產品'[產品名稱]),
[實際訂單數量],
SUMX(
VALUES('產品'[產品名稱]),
[實際訂單數量]
)
)
-----------------
這個度量值的先利用IF函數做個判斷,如果當前上下文是產品名稱,就計算 [實際訂單數量],否則,就利用SUMX對所有的產品名稱的 [實際訂單數量]求和。
看一下計算結果,
總計行得到了正確的結果。
實際上這個度量值的寫法還可以繼續簡化,連IF判斷都省略掉,直接用SUMX.
---------------
實際訂單數量2 =
SUMX(
VALUES('產品'[產品名稱]),
[實際訂單數量]
)
---------------
同樣得到了正確的結果。
這就是SUMX的強大之處,在明細行,利用VALUES函數獲取當前的上下文,計算當前上下文的訂單數量,在總計行,自動對篩選出的所有的產品名稱的數據進行匯總。
[實際訂單數量2]的寫法,就是終極解決方案。
總結
為了使總計行計算出正確的結果,終極解決方案只需兩步:
1、先正常寫一個度量值,保證明細行正確;
2、在第1步度量值的基礎上,套一層SUMX函數,即可保證明細行和總結行均正確。
然后使用第二步的度量值作為表格的值就可以了。
(如果熟練,你也可以一步寫出最終的度量值)
記住這個終極方案DAX:
SUMX(
VALUES(明細行字段),
[明細行正確的度量值]
)
下次再遇到類似問題,你可以直接套用。
練習PowerBI時若沒有數據,可以在公眾號回復關鍵字"數據"獲取我整理的近百個精選數據集。
如果文章對你有幫助,看完別忘了點個贊哦。