父子层级结构是一种常见的数据组织形式,本篇文章将介绍如何在PowerBI中使用PATH系列函数来处理这种典型的层级数据。
问题描述
自行建模计算,计算各员工的直接下属的数量。注意:计算的是直接下属,下属的下属虽然都是下属,但却并不是直接下属。
具体问题如下图所示:
本案例的初始数据如下:
Employee:
id | name | managerId |
---|---|---|
101 | John | |
102 | Dan | 101 |
103 | James | 101 |
104 | Amy | 102 |
105 | Anne | 102 |
106 | Ron | 102 |
107 | Jack | 103 |
108 | Dami | 103 |
109 | Tom | 107 |
若需其它辅助表等,可自行创建并建模。
解题要点
本案例的数据结构是典型的父子层级结构,因此可以先使用PATH函数来获取层级路径,例如:
然后就可以从层级路径中通过关键字查找,来过滤出直接下属的数据,这也是在DAX中处理父子层级结构的常用套路。
但如果回归到案例本身,其实还可以直接筛选经理ID等于当前员工ID的方法来解决,这也更简单直接。
解决方案
首先,数据模型如下图所示:
然后,创建如下度量值,这里提供两种方法:
直接下属数量 1 =
VAR TempTbl = ADDCOLUMNS(ALL('Employee'),"Level",PATH('Employee'[id],'Employee'[managerId]))
VAR CurID = MAX('Employee'[id])
VAR CurLevel = MAXX('Employee',PATH(Employee[id],'Employee'[managerId]))
RETURN
COUNTROWS(FILTER(TempTbl,FIND(CurID,[Level],,0) && PATHLENGTH(SUBSTITUTE([Level],CurLevel,""))=2))+0
直接下属数量 2 = CALCULATE(COUNT('Employee'[id]),'Employee'[managerId]=MAX('Employee'[id]),ALL('Employee'[name]))+0
然后创建一个矩阵,并将姓名字段作为行标签,再将上面的度量值放入矩阵的值字段即可,如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627