本文分享一個父子層級結構的計算思路,源于昨天遇到星友提出這樣一個問題,有兩列數據,一列是邀請人、一列是被邀請人,示例如下圖:
被邀請人還可以繼續邀請其他人,并且所有的下級都視作上級的邀請,如何計算每個人的邀請人數?
這種需求是不是很常見,邏輯描述起來非常簡單,但是計算并不容易,因為這種結構的數據雖然隻有兩列,但邀請人和被邀請人是可以來回變動的,每個人的角色并不固定,并且下面有多少邀請層級也是未知。
這種數據結構就是父子層級結構,邀請人是父級别,被邀請人是子級别,在PowerBI中,有一類DAX函數,父子函數,專門處理這種結構的計算,它可以将父子層級結構轉換為扁平的普通層級結構。
下面就以上面的需求為例,來介紹PowerBI處理這種計算的思路,并見識一下父子函數的用法。
步驟如下:
1. 補充完善原始數據
為了方便使用父子函數,我們需要先對上面示例的數據進行補充整理,為父子結構添加編号。
因為父子函數要求,所有父級列的數據都必須存在于子級列中,所以對于以上示例,添加一行,将最頂級的人員“李一”,添加到被邀請人中,這也容易理解,所有的人都是被邀請人,隻是最頂級的人員,無上級邀請人而已。
然後對子級列,也就是每個被邀請人添加一列編号,并相應的把邀請人的編号匹配上去,你也可以先在Excel中做好這個表:
這個表完善以後,下面就可以利用父子函數來轉換層級了。
2. 将父子結構轉換為普通層級結構
以下計算都是利用計算列完成,首先利用PATH函數來獲取完整的層級路徑:
層級路徑 =
PATH('結構表'[被邀請人編号],'結構表'[邀請人編号])
PATH函數有兩個參數,第一個參數是子級的列,第二個參數是父級的列,它的計算結果是層級的完整路徑,用 “|” 分割,通過這個路徑,你可以看出每個人的上下級關系。
有了路徑之後,下面就可以計算每一層級的人員。
第一層級可以這樣來寫:
這裡用到的父子函數是PATHITEM,它可以從層級路徑中獲取某一個層級的值,第二個參數是1,就是獲取第一層級的值,這個例子第一層級都是1。
然後利用LOOKUPVALUE函數,從被邀請人編号中,找出1對應的被邀請人名稱,也就是“李一”,所有人的第一級邀請人都是他。
同理,通過更改PATHITEM函數的第二個參數,獲取第二、第三、第四個層級分别是誰:
上表中的後面四列是4個層級,就是我們常見的普通層級結構。
如果層級很多,無法一眼看出每個人有多少個層級,還有個父子函數是PATHLENGTH,它用來計算層級的深度:
這樣就可以看出每個人的上級有幾層了,後面也會用到這個深度。
3. 展現結果
有了上面的普通層級結構,就可以很方便的計算出每個人的邀請人數了,寫個度量值:
邀請人數 =
DISTINCTCOUNT('結構表'[被邀請人])-1
因為計算邀請人數時,不應該計算自己,所以減去1,剩下的就是本人的邀請人數。
将所有的層級放到矩陣的行中,邀請人數作為值,結果如下:
這樣就一次性得到了每個人的邀請人數。
但是有一個問題,因為每個層級都有空值,所以這個矩陣結構有太多的空結構,有必要處理一下。
思路就是讓空結構的計算結果等于空值,修正度量值如下:
這個度量值的計算邏輯是,比較當前層級結構與當前數據的層級深度,如果當前結構小于等于層級深度,正常計算邀請人數,否則返回BLANK。
這個邏輯可能不太好理解,你可以根據上下文,比如矩陣的第一行李一,對于上面度量值中的變量X,返回1,變量Y也返回1,所以滿足條件,正常計算邀請人數;而第二行,X返回2,但是Y還是1,所以不滿足條件,返回BLANK。
用這個修正後的度量值制作矩陣,效果如下:
這樣就清晰直觀了實現了該業務需求。
關于父子函數的計算,如果你剛開始接觸,會感覺非常繞,其實理解了以後,并沒有什麼難度,關鍵是理解父子結構計算的整體思路,弄明白為什麼需要将它轉換為普通的層級結構,以及如何利用父子函數進行轉換。
更多推薦:PowerBI如何進行财年分析?
通過一個經典案例,來學習PowerBI可視化的制作思路
在PowerBI中如何快速計算員工在職天數?
采悟 | PowerBI星球
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!