本文來自星友Beau的分享,在進行數據指標的展現時,對關鍵的少數單獨展示,而對剩余的大多數折疊為其他項,是一個很常用的做法。Beau同學通過一個日常的辦公場景,詳細介紹了PowerBI實現的步驟,值得大家借鑒。
KPI指標動態展示之TOPN及其他
作者:Beau
一、背景故事
2020年第一天上班,B同學還沉浸在跨年的喜悅中,坐在工位上,喝了一口枸杞養生茶,隨即打開了電腦,郵箱提醒老板發來一封郵件,頓時心頭一緊,不會有重要工作吧,趕緊點開郵件,看着看着,眉頭漸舒,原來老板讓他對19年所有客戶的銷售做排名展示,以了解公司頭部客戶去年銷售表現,具體要求為:
1.TOPN中的N值動態可選。
2.除了TOPN中的客戶,其余客戶銷售歸為“其他”組顯示。
3.顯示TOPN和"其他"組的銷售占比情況。
B同學此時心中竊喜,這需求貌似在網上看到過現成解決方案,那就簡單了,打開度娘,照葫蘆畫瓢,不到半個小時,B同學就搞定把郵件發出。在釘釘上和同事聊了幾句,剛拿起茶杯,郵箱提醒老板郵件又來了,是不是被我的效率震驚了?趕緊點開郵件,郵件大意如下:
1.對完成速度和質量表示認可。
2.對內容有了新的要求:
*對於TOPN客戶,不要匯總在一起,要看到客戶明細。
*對於KPI指標要實現動態切換,比如銷售額,銷量,利潤等。
3.中午十二點前要給到老板。
B同學此時的心情悲喜交加,新訴求看起來簡單,但是對於之前沒有過類似實操經驗的B同學來說,難度頗大,度娘這次也不好使了,看了一下時間,離十二點還有三個小時,燒香拜佛已然來不及,求人不如求己,B同學放下茶杯,扶了扶眼鏡,帶上耳塞,點開PBI,開干......
二、制作步驟
1.模型概覽
四個維度表(地區,客戶,產品,日期)與一個事實表(訂單)分別建立一對多的單向篩選關系。其余是三個自建的輔助表以及一個存放度量值的表。
2.構造輔助表
根據老板的訴求,要實現對TOPN的客戶明細顯示以及KPI指標的切換,那么這里需要建立三個輔助表,具體如下:
參數N(范圍1-50)
KPI類別表(便於實現KPI動態切換)
KPI類別表 =
SELECTCOLUMNS (
{ ("銷售額", "1" ),( "銷量", "2" ),( "利潤額","3" ), ( "利潤率", "4" )},
"KPI", [Value1], "orderby", [Value2])
TOPN參數表(包含所有客戶姓名+其他,便於后續動態展示)
TOPN參數表 =
VAR customer =
SELECTCOLUMNS ( VALUES ( '客戶'[客戶名稱] ), "TOPN參數", [客戶名稱] )
VAR others = { "其他"}
RETURN UNION ( custrom, others )
這個輔助表的建立很重要,是在后續可視化中將客戶組與“其他“組同時展示的關鍵。
3.建立度量值
涼菜上完了,硬菜馬上端上桌,需要建立的具體度量值如下所示。
先嘮叨幾句,對於度量值要做好歸類整理和規范命名工作,否則后期度量多了之后你真的會懵逼(關於度量值的歸類整理可參考:利用這3個步驟,輕松管理你的度量值)
簡單的基礎度量就不在花時間贅述了,下面重點對核心度量進行解釋說明。
base.kpi.auto=
VAR kpiname = SELECTEDVALUE ( 'KPI類別表'[KPI] )
RETURN
SWITCH ( kpiname,
"銷售額", [base.salse],
"銷量", [base.volume],
"利潤額", [base.Profit],
"利潤率", [base.Profit%]
)
度量本身不難,作用為實現對KPI的動態切換。
rank.kpi=
CALCULATE (
[base.kpi.auto],
TREATAS (VALUES ( 'TOPN參數表'[TOPN參數] ), '客戶'[客戶名稱] ))
看着也很簡單吧,但很重要,我們從模型關系圖中可以看到在這里B同學並沒有將TOPN參數表與任何表建立關系,那么該如何實現利用TOPN參數表的字段對KPI指標進行篩選呢?這里我們用到了TREATAS函數,通過共有字段[客戶名稱]建立虛擬關系連接兩表,這也是一種無侵入式的設計思路。
rank.rank=RANKX ( ALL ( 'TOPN參數表'[TOPN參數] ), [rank.kpi] )
有了rank.kpi度量,那么接下來就是自然的對此度量進行排名。
如果前面介紹的幾個度量可以稱之為后台度量或基礎度量,那么后面我們要介紹的度量便可以稱為前端度量或展示度量。
先上效果圖:
對上圖進行簡單分析,有三個列字段,TOPN即之前建立的輔助表TOPN參數表,KPI即為核心指標,還有對KPI排名的RANK。
接下來重點講一下KPI以及RANK度量值的構建
KPI度量值
view.topn&others=
VAR top_category = SELECTEDVALUE ( 'TOPN參數表'[TOPN參數] )
VAR N = TOPN ( [參數N 值], VALUES ( '客戶'[客戶名稱] ), [base.kpi.auto] )
RETURN
SWITCH ( TRUE(),
[rank.rank] <= [參數N 值],[rank.kpi],
top_category = "其他", CALCULATE ([base.kpi.auto], EXCEPT ( ALLSELECTED ( '客戶'[客戶名稱] ), N ) )
)
整體思路是將參數N值和[rank.rank]進行對比,小於等於時顯示[rank.kpi],其次當'TOPN參數表'[TOPN參數]=“其他”時,顯示除TOPN值以外的客戶匯總值,要重點注意函數EXCEPT在這里的使用邏輯,這里作為獲取差集來使用。
RANK度量值
view.rank=
VAR top_category= SELECTEDVALUE ( 'TOPN參數表'[TOPN參數] )
RETURN
SWITCH (
TRUE(),
HASONEVALUE ( 'TOPN參數表'[TOPN參數] ) && [view.topn&others] <> 0 && [rank.rank] <= [參數N 值], [rank.rank],
HASONEVALUE ( 'TOPN參數表'[TOPN參數] ) && [view.topn&others] <> 0 && top_category = "其他", 51 )
回到效果圖,能看出對於RANK字段,我們實現了客戶KPI的降序排列,同時也將“其他”放在表格底部且不存在RANK值,大家這里會發現要實現這樣的效果,通過構建輔助表的常規方式也許可以實現,但是非常復雜,這里B同學采用了曲線救國的方法,我們給到“其他”一個很大的RANK數字,同時將這個數字顏色設置成與底色一致,那么就變相的實現了隱藏RANK值的目的。上面度量中的RANK值設置為51就是出於這個目的。
4.制作可視化
做完上面的工作,時間已到了十一點半,B同學長舒了一口氣,還好,核心工作已經完成,下面就剩可視化的展現。
老板要求看到累計占比,首先想到的就是折線和簇狀柱形圖,加切片器,調位置,上配色。一氣呵成,最終效果如下圖所示:
這時鬧鍾響了,還剩最后五分鍾,上傳,發送,B同學終於趕在12點前將郵件發出。
對着電腦屏幕,B同學陷入了沉思,切片維度能否加入年,季,月?對於TOPN客戶能否進行ABC分析?能否將客戶維度擴展到其他維度?是否應該第一次交差就做仔細思考而不是敷衍了事?茶雖已涼,心卻很熱,B同學發現能做的還有很多,這僅僅是開始......
三、寫在最后
通過本文希望能讓大家對(TOPN明細+其他)及KPI指標動態展示有較完整且清晰的了解。
文章有干貨也有情懷,在職場中的小伙伴們,是否從B同學的身上依稀看到了當年的自己,希望大家都能在新的一年中,發現關於自己更多未知的可能。
本人能力有限,文中如有不當之處,請各位小伙伴給予批評指正。
最后感謝@佐羅老師的數據源,感謝@采悟老師和@天行老師的不吝指導,他們不間斷高質量的輸出,使我受益良多,站在巨人的肩膀上,會讓我看的更遠。
PS:仔細看,圖中有亮點,源文件中有更多驚喜哦!