如何使用DAX提取班次符合时间规则的可补偿员工ID
问题根因
你之前的DAX报错核心是LOOKUPVALUE函数的用法不符合语法规则:该函数仅支持等值匹配的检索逻辑,要求传入的匹配参数必须是「列=固定值」的形式,不支持<、>=这类范围判断的布尔条件,因此无法实现你要的筛选逻辑。
你之前写的时间差计算逻辑本身没有问题,DATEDIFF以分钟为单位计算班次开始时间到通知时间的间隔,当间隔在0到120分钟区间时,刚好对应「通知时间距班次开始不足2小时、员工未提前收到足够通知」的判定规则。
实现方案
根据你不同的使用场景,可直接选用以下对应代码:
方案1:原表新增计算列打标(最常用)
直接在原数据表新增标记列,后续做筛选、透视、可视化时直接用该字段过滤即可,不需要额外建表:
符合补偿资格 = VAR _timeDiff = DATEDIFF('Table1'[Shift Start Time], 'Table1'[Resonable Notice Time], MINUTE) RETURN IF( _timeDiff >= 0 && _timeDiff < 120, TRUE(), FALSE() )
使用时将该字段筛选为TRUE,即可导出所有符合补偿条件的员工及对应班次记录。如果不需要单独留存Time Diff字段,用上述内嵌变量的写法即可,减少表内冗余列。
方案2:新建独立表存储符合条件的员工ID
如果需要单独生成一张只包含可获补偿员工ID的维表,可通过「新建表」功能运行以下代码:
可获补偿员工表 = DISTINCT( SELECTCOLUMNS( FILTER( 'Table1', VAR _timeDiff = DATEDIFF('Table1'[Shift Start Time], 'Table1'[Resonable Notice Time], MINUTE) RETURN _timeDiff >=0 && _timeDiff <120 ), "EmpID", 'Table1'[EmpID] ) )
该表自动去重,不会出现同一员工ID重复展示的问题。
方案3:度量值动态拼接展示符合条件的员工ID
如果需要在报表卡片、文本区域直接展示所有符合条件的员工ID,可新建以下度量值:
符合条件员工ID列表 = CONCATENATEX( FILTER( 'Table1', VAR _timeDiff = DATEDIFF('Table1'[Shift Start Time], 'Table1'[Resonable Notice Time], MINUTE) RETURN _timeDiff >=0 && _timeDiff <120 ), 'Table1'[EmpID], "、" )
注意:如果存在同一员工对应多条班次记录的情况,可根据业务规则调整判定逻辑:如果要求员工只要有一个班次满足条件即可获得补偿,用方案2的去重逻辑即可;如果要求仅对应满足条件的班次核算补偿,用方案1的逐行打标逻辑即可。
内容的提问来源于stack exchange,提问作者SSFA
相关产品推荐
相关产品推荐

