如何使用DAX按员工维度计算WTD/MTD/YTD累计总工时?
DAX 员工多维度工时计算实现方案
前置依赖
- 已创建覆盖全部打卡时间范围的独立日期维度表,与打卡表的打卡日期字段建立一对多活跃关系
- 打卡表至少包含2个核心字段:
员工姓名(文本类型)、打卡时间(日期时间类型),无单独打卡日期字段的可通过DATE([打卡时间])临时提取
基础度量值:单日工时
按员工+日期维度,计算单天有效工时(返回单位为小时,可自行调整单位)
单日工时 = VAR 当日最早打卡 = CALCULATE(MIN(打卡表[打卡时间]), ALLEXCEPT(打卡表, 打卡表[员工姓名], '日期表'[日期])) VAR 当日最晚打卡 = CALCULATE(MAX(打卡表[打卡时间]), ALLEXCEPT(打卡表, 打卡表[员工姓名], '日期表'[日期])) RETURN // 仅当日存在至少2条打卡记录时返回工时,可根据业务规则调整判断逻辑 IF( NOT(ISBLANK(当日最早打卡)) && NOT(ISBLANK(当日最晚打卡)) && 当日最早打卡 <> 当日最晚打卡, DATEDIFF(当日最早打卡, 当日最晚打卡, HOUR) + DATEDIFF(当日最早打卡, 当日最晚打卡, MINUTE)/60, BLANK() )
多维度累计工时度量值
基于上述单日工时度量值,结合DAX时间智能函数实现各周期累计,自动按员工维度独立统计:
WTD(周累计工时)
WTD累计工时 = CALCULATE( [单日工时], DATESWTD('日期表'[日期]), ALLEXCEPT(打卡表, 打卡表[员工姓名]) )
MTD(月累计工时)
MTD累计工时 = CALCULATE( [单日工时], DATESMTD('日期表'[日期]), ALLEXCEPT(打卡表, 打卡表[员工姓名]) )
YTD(年累计工时)
YTD累计工时 = CALCULATE( [单日工时], DATESYTD('日期表'[日期]), ALLEXCEPT(打卡表, 打卡表[员工姓名]) )
可选优化规则
- 需排除休息日/法定节假日的,可在日期表新增
是否工作日布尔列,所有度量值的CALCULATE筛选参数中新增'日期表'[是否工作日] = TRUE()即可 - 需处理单日仅1条打卡、跨天打卡等异常场景的,直接修改
单日工时的返回判断逻辑即可,所有累计度量值会自动继承规则 - 矩阵视图展示时,行维度放
员工姓名,列维度放日期表的年/季/月/周/日层级,值放对应度量值即可实现自动聚合统计
内容的提问来源于stack exchange,提问作者Manu Vats
相关产品推荐
相关产品推荐

