數據可視化之DAX篇(五) 使用PowerBI的這兩個函數,靈活計算各種占比


https://zhuanlan.zhihu.com/p/57861350

計算個體占總體的比例是一個很常見的分析方式,它很簡單,就是兩個數字相除,但是當需要計算的維度、總體的范圍發生動態變化時,如何靈活且快速的計算出各種占比,還是需要動一點心思的。

本文就通過 DAX 中的 ALL 和 ALLSELECTED 函數來看看在 PowerBI 中是如何快速計算出各種占比的。


數據為虛擬的某網上商城的電子產品的銷售記錄,我們根據銷售額指標來計算某產品的占總體或者類別的比例。

首先寫一個銷售額的度量值,

銷售額 = SUM('訂單'[銷售額])

在矩陣中看看該度量值的結果,

 

總體占比

 

計算占總體的比例,就是每一個類別的銷售額都除以總計數,計算總計數,可以用 ALL 函數清除外部上下文的篩選,如果單獨計算出總計銷售額,可以這樣寫,

銷售額總計=CALCULATE([銷售額],ALL('產品')

將該度量值放入到卡片圖中,可以看到正好是2,305,350.

這里為了更加直觀,我們直接寫出占總體比例的度量值,

總體占比 = DIVIDE([銷售額],CALCULATE([銷售額],ALL('產品')))

矩陣中結果如下,

 

為了進一步分析具體每一種產品的占比,把產品名稱展開,

 

 

分類占比

每一種產品相對於總體的比例都計算出來了,但是如果還需要知道每一種產品占所屬分類的比例,可以這樣寫,

 

分類占比 =
DIVIDE([銷售額],CALCULATE([銷售額],ALL('產品'[產品名稱])))

 

結果如下,

 

 

這張表中最后一列每種產品占分類的比例正是想要的結果,這兩個度量值的區別就在於ALL('產品')和ALL('產品'[產品名稱])。

ALL('產品')是清除對產品表上所有的列的上下文,正如上面看到的,CALCULATE([銷售額],ALL('產品')的結果就是總體的銷售額。

 

而ALL('產品'[產品名稱])僅僅是清除產品名稱的上下文,如果上下文不是產品名稱,那么它還是會繼續計算,比如第一行是類別:電腦外設,它不屬於產品名稱,那么這個度量值會計算電腦外設的銷售額。

可以單獨寫一個度量值觀察一下結果,

 

銷售額 分類 = CALCULATE([銷售額],ALL('產品'[產品名稱]))

可以看出每一個產品計算出的銷售額都是所屬分類的匯總銷售額,正是利用這個特點,拿產品的銷售除以類別合計銷售額,就得到的每種產品占所屬類別的比例。

按篩選上下文計算總體占比

 

現在如果想分析具體某幾個產品的數據,用產品名稱做個切片器,效果如下,

 

 

 

除了類別行和總計行的占比發生了變化,每一種產品的占比數據並沒有變化。

如果我們只是想分析所選的這幾種產品,把所選這幾種產品作為一個整體,來分析每種產品占所選產品的比例,這個結果顯然不能讓人滿意。

 

是時候請出ALLSELECTED函數登場表演了!

 

要計算每一種產品占所選品種合計銷售額的比例,度量值如下,

按篩選 占總體% =
DIVIDE([銷售額],CALCULATE([銷售額],ALLSELECTED('產品')))

 

 

最后一列的占比,無論我們篩選哪些產品,總體比例都是100%,而每一種產品,都是該產品占所選產品的比例。

ALLSELECTED函數針對外部上下文中進行篩選計算,正好是我們需要的效果。

 

按篩選上下文計算類別占比

如果我們想進一步計算按外部所選的產品,並且按照產品類別,來計算相對產品類別的百分比,怎么做呢?

也許你已經想到了,和上面一樣,使用ALLSELECTED('產品'[產品名稱],

按篩選 占分類% =
DIVIDE([銷售額],CALCULATE([銷售額],ALLSELECTED('產品'[產品名稱])))

 

 

正是期望中的結果。

從這幾個實例可以看出,使用DAX來計算占比非常靈活,稍微一改動,結果大不同,以硬盤為例,通過ALL和ALLSELECTED函數和參數的變化,獲得了4個不同的占比,並且每種占比都具有一定的意義,都是在某種業務場景下的真實需求。

 

總結

 

其實上面計算的每一種占比,分子都不變,只是通過ALL和ALLSELECT函數及其參數的選擇操控不同的上下文環境,來控制分母的計算,進而得到我們所需要的占比。

 

1,計算占總體的比例,

總體占比 =
DIVIDE([銷售額],CALCULATE([銷售額],ALL('產品')))

 

2,計算占類別的比例,

分類占比 =
DIVIDE([銷售額],CALCULATE([銷售額],ALL('產品'[產品名稱])))

 

3,按外部篩選上下文,計算占總體的比例,

按篩選 占總體% =
DIVIDE([銷售額],CALCULATE([銷售額],ALLSELECTED('產品')))

 

4,按外部篩選上下文,計算占類別的比例,

按篩選 占分類% =
DIVIDE([銷售額],CALCULATE([銷售額],ALLSELECTED('產品'[產品名稱])))

 

DAX函數並不是很容易理解,必須基於不同的上下文環境來觀察結果,通過不斷的練習、思考背后的邏輯,才能更好的掌握。


免責聲明!

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



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