Power BI DAX实现未晋升员工数逐年动态累加的方法
DAX实现动态累加未晋升员工数解决方案
问题背景
现有Excel员工数据,包含姓名、父亲姓名、职位、部门,以及LastPromotionDate(最后晋升日期)和EligibilityDates(晋升资格生效日期)两列。已通过DAX度量值TotalNotPromotedTill2023算出2023年底未晋升员工数为100(这类员工的EligibilityDates在2023年及之前,具备晋升资格但未获得晋升)。
需求:将100这个基数动态累加到2024年及后续年份的新增符合晋升条件且未晋升员工数中,形成逐年累计的总数:
- 2024年新增20名符合条件员工,显示总数120
- 2025年新增30名,显示总数150
- 以此类推逐年累加
此前直接将TotalNotPromotedTill2023与各年份新增数相加,会导致每一年都重复加100,不符合需求。
问题分析
之前的代码错误在于未正确控制基准值的应用范围:基准值仅应作为2024年的初始值,之后每年累加当年新增数,而非每一年都重复叠加基准值。需要通过时间上下文判断当前年份,计算从2024年到当前年份的累计新增数,再与基准值相加。
解决方案DAX代码
TotalNotPromotedAccumulated = VAR CurrentYear = YEAR(SELECTEDVALUE('Date'[Year])) -- 优先使用独立日期表的年份字段 VAR BaseCount = [TotalNotPromotedTill2023] -- 计算单一年份内新增的符合资格但未晋升员工数(逻辑需与TotalNotPromotedTill2023对齐) VAR NewEligibleCount = CALCULATE( COUNTROWS('YourTable'), YEAR('YourTable'[EligibilityDates]) = CurrentYear, -- 未晋升判断:无晋升记录 或 晋升日期晚于资格生效日期 ISBLANK('YourTable'[LastPromotionDate]) || 'YourTable'[LastPromotionDate] > 'YourTable'[EligibilityDates] ) -- 计算2024年至当前年份的累计新增数 VAR CumulativeNew = CALCULATE( SUMX( FILTER( ALL('Date'[Year]), 'Date'[Year] >= 2024 && 'Date'[Year] <= CurrentYear ), NewEligibleCount ) ) RETURN -- 仅在2024年及以后返回累加值,2023及以前可返回空值或原基数 IF( CurrentYear < 2024, BLANK(), BaseCount + CumulativeNew )
代码说明
- CurrentYear:获取图表当前上下文选中的年份,推荐使用独立的日期表(Date Table)管理时间维度,这是Power BI/DAX中处理时间智能的标准做法,能避免时间上下文混乱。若未使用日期表,可改为
YEAR(SELECTEDVALUE('YourTable'[EligibilityDates]))。 - BaseCount:直接复用已有的2023年底未晋升员工基数度量值。
- NewEligibleCount:计算单一年份内新增的符合晋升资格但未晋升的员工数,这里的未晋升判断逻辑需与
TotalNotPromotedTill2023完全对齐,确保统计口径一致。 - CumulativeNew:通过
SUMX和筛选逻辑,计算从2024年到当前选中年份的所有新增员工数的累计值,实现逐年累加的效果。 - 返回逻辑:仅在2024年及以后的年份返回基数+累计新增数,2023及以前返回空值(可根据可视化需求改为返回
BaseCount)。
注意事项
- 若未使用独立日期表,需确保
YourTable中的EligibilityDates无空值,且年份提取逻辑准确。 - 务必保证
NewEligibleCount中的未晋升判断逻辑与TotalNotPromotedTill2023一致,否则会出现统计口径不一致的问题。
内容的提问来源于stack exchange,提问作者Uzair Qaiser
相关产品推荐
相关产品推荐

