如何计算两个日期区间内的员工平均人数?
日期区间内平均在职员工数计算方案
问题背景
现有日期表与Staffmaster表(一对多关系),Staffmaster包含员工唯一ID、入职日期(Current Employment: Start Date)、离职日期(End Date)。已实现单日/指定日期的在职员工数计算,需计算筛选日期区间内的平均在职员工数,原用首尾日期人数取平均的方法及自定义DAX未得到预期结果。
原方法核心问题
原方案仅取区间首尾两天的人数求平均,且Previous Staff的逻辑错误(筛选的是整个区间全程在职的员工,而非区间起始日的在职员工),忽略了区间内员工入职/离职带来的每日人数波动,无法反映真实平均水平。正确逻辑应为:区间内每日在职员工数之和 ÷ 区间总天数。
正确DAX实现步骤
1. 基础度量:单日在职员工数
先定义一个高效的单日在职员工数度量值,作为后续计算的基础:
在职员工数 = CALCULATE( DISTINCTCOUNT(STAFFMASTER[Unique Id]), -- 入职日期不晚于当前计算日期 STAFFMASTER[Current Employment: Start Date] <= MAX('Date'[Date]), -- 未离职或离职日期晚于当前计算日期 OR(ISBLANK(STAFFMASTER[End Date]), STAFFMASTER[End Date] > MAX('Date'[Date])), -- 解除日期表与入职日期的交叉筛选,避免关系干扰 CROSSFILTER(STAFFMASTER[Current Employment: Start Date], 'Date'[Date], None) )
2. 核心度量:区间平均在职员工数
基于上述基础度量,计算区间内每日人数总和并除以天数:
平均在职员工数 = VAR 区间总天数 = DATEDIFF(MIN('Date'[Date]), MAX('Date'[Date]), DAY) + 1 VAR 区间总在职人数 = CALCULATE( [在职员工数], -- 保留筛选的日期区间范围 ALLSELECTED('Date'), -- 对区间内每个日期单独计算在职人数后求和 VALUES('Date'[Date]) ) RETURN -- 安全除法,避免除数为0的错误 DIVIDE(区间总在职人数, 区间总天数)
说明
ALLSELECTED('Date')确保计算范围是用户筛选的整个日期区间,不受其他上下文筛选影响VALUES('Date'[Date])会遍历区间内的每一天,分别计算当日在职人数并自动求和DATEDIFF(...) + 1是为了包含区间首尾两天(例如2022-10-31到今日,天数需加1)DIVIDE函数会自动处理除数为0的异常情况(比如未选择日期区间时返回空白)
内容的提问来源于stack exchange,提问作者hmltnangel
相关产品推荐
相关产品推荐

