You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DAX度量仅单次统计EmployeeID,求月度员工人数计算方案

月度员工人数追踪DAX度量问题解决

问题背景

需基于员工表的Hire Date(雇佣日期)、Termination Date(离职日期)、Transfer In Date(转入日期)字段,在PowerPivot中编写DAX度量,实现以下统计:

  • 每月在职员工数
  • 每月新入职员工数
  • 每月转入员工数
  • 每月离职员工数

当前ActiveEmployees度量存在问题:仅在员工入职/转入当月统计该员工,后续在职月份未被计入,原代码如下:

ActiveEmployees:=
CALCULATE(
 COUNTROWS(TableName),
 FILTER(
  TableName,
  (  
   NOT(ISBLANK([HireDate]) && [HireDate] < MAX(DimDate[Date])
  )
  &&
  (
   ISBLANK([TransferDate]) || [TransferDate] < MAX(DimDate[Date])
  )
  &&
  (
   ISBLANK([TermDate]) || [TermDate] > MAX(DimDate[Date])
  )
 )
)

问题原因

原代码直接筛选员工表,结合MAX(DimDate[Date])的逻辑仅判断员工是否在当前日期上下文的最后一天在职,但未遍历每个员工的全周期在职月份。需改为针对每个员工ID,判断其是否在当前统计月份内处于在职状态。

修正后的DAX度量

1. 每月在职员工数

ActiveEmployees := 
VAR CurrentMonthEnd = EOMONTH(MAX(DimDate[Date]), 0)
VAR CurrentMonthStart = STARTOFMONTH(DimDate[Date])
RETURN
SUMX(
    VALUES(TableName[EmployeeID]),
    VAR EmployeeHireDate = CALCULATE(MAX(TableName[HireDate]))
    VAR EmployeeTransferDate = CALCULATE(MAX(TableName[TransferDate]))
    VAR EmployeeTermDate = CALCULATE(MAX(TableName[TermDate]))
    VAR EffectiveStartDate = IF(ISBLANK(EmployeeTransferDate), EmployeeHireDate, MAX(EmployeeHireDate, EmployeeTransferDate))
    VAR IsActive = 
        AND(
            EffectiveStartDate <= CurrentMonthEnd,
            OR(ISBLANK(EmployeeTermDate), EmployeeTermDate > CurrentMonthStart)
        )
    RETURN
    IF(IsActive, 1, 0)
)

逻辑说明:

  • 先获取当前统计月份的起止日期
  • 遍历每个唯一员工ID,计算其有效入职日期(取雇佣日期和转入日期的较晚者)
  • 判断该员工的有效起始日期是否早于等于当月月末,且离职日期(若有)晚于当月月初,满足则计为1,最后求和得到在职人数

2. 每月新入职员工数

NewHires := 
CALCULATE(
    DISTINCTCOUNT(TableName[EmployeeID]),
    DATESBETWEEN(
        DimDate[Date],
        STARTOFMONTH(DimDate[Date]),
        EOMONTH(DimDate[Date], 0)
    ),
    NOT(ISBLANK(TableName[HireDate])),
    ISBLANK(TableName[TransferDate]) -- 若转入员工不算新入职则保留,否则移除该条件
)

3. 每月转入员工数

TransfersIn := 
CALCULATE(
    DISTINCTCOUNT(TableName[EmployeeID]),
    DATESBETWEEN(
        DimDate[Date],
        STARTOFMONTH(DimDate[Date]),
        EOMONTH(DimDate[Date], 0)
    ),
    NOT(ISBLANK(TableName[TransferDate]))
)

4. 每月离职员工数

Terminations := 
CALCULATE(
    DISTINCTCOUNT(TableName[EmployeeID]),
    DATESBETWEEN(
        DimDate[Date],
        STARTOFMONTH(DimDate[Date]),
        EOMONTH(DimDate[Date], 0)
    ),
    NOT(ISBLANK(TableName[TermDate]))
)

内容的提问来源于stack exchange,提问作者rowneil10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:09:54