了解各部门薪资分布情况是一个常见但重要的分析需求,本篇文章将介绍如何在PowerBI中实现各部门工资前三高员工的筛选与计算。
问题描述
自行建模计算,在允许并列排名的情况下找出各部门工资前三高的员工,并保证总计正确。
具体问题如下图所示:
本案例的初始数据如下:
部门表:
id | department |
---|---|
1 | IT |
2 | Sales |
员工表:
id | name | salary | departmentId |
---|---|---|---|
1 | Joe | 85000 | 1 |
2 | Henry | 80000 | 2 |
3 | Sam | 60000 | 2 |
4 | Max | 90000 | 1 |
5 | Janet | 69000 | 1 |
6 | Randy | 85000 | 1 |
7 | Will | 70000 | 1 |
若需其它辅助表等,可自行创建并建模。
解题要点
该案例不算复杂,只需要先找出各部门的薪资排前三的员工,然后再做判断或者做筛选器相交来限制返回结果即可。
另外,由于本案例的排名是允许并列排名的,因此不能直接使用TOPN
函数来查找薪资排前三的员工,因为TOPN
函数的排名算法是SKIP
样式的,而本案例需要用到DENSE
样式的排序。
虽然无法使用TOPN
函数来查找薪资排前三的员工,但可以用来查找前三高的薪资,只要对薪资去重后再使用TOPN
函数即可。
解决方案
首先,数据模型如下图所示:
然后,创建如下度量值,以下提供三种方法:
Top3 Salary 1 =
CALCULATE(
SUM('员工表'[salary]),
KEEPFILTERS(
FILTER(
CROSSJOIN(VALUES('部门表'[department]),ALL('员工表'[name])),
RANKX(
ALL('员工表'[name]),
CALCULATE(SUM('员工表'[salary])),,DESC,DENSE
)<=3
)
)
)
Top3 Salary 2 =
CALCULATE(
SUM('员工表'[salary]),
WINDOW(
1,ABS,3,ABS,
ALL('员工表'[salary],'员工表'[departmentId]),
ORDERBY('员工表'[salary],DESC),
PARTITIONBY('员工表'[departmentId])
)
)
Top3 Salary 3 =
SUMX(
VALUES('部门表'[department]),
CALCULATE(
SUM('员工表'[salary]),
TOPN(
3,
CALCULATETABLE(VALUES('员工表'[salary]),ALL('员工表'[name])),
'员工表'[salary]
)
)
)
然后创建一个矩阵,并将部门和员工姓名字段作为行标签,再将上面的度量值放入矩阵的值字段即可,如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627