PowerBI中用DAX计算员工下一个可用日期的问题排查
问题:DAX度量值无法正确返回员工下一个可用负载日期
我有一份员工每日负载表,结构及数据示例如下:
Date | assignee | TotalLoad (%) 01.01.2023 employee_X 125 01.01.2023 employee_X 75 01.01.2023 employee_X 25 ... 31.12.2023 employee_X 50 01.01.2023 employee_Y 125 01.01.2023 employee_Y 75 01.01.2023 employee_Y 50 ... 31.12.2023 employee_Y 50
我需要编写一个DAX度量值,找出员工下一个负载小于100%的可用日期。
我尝试了以下DAX代码,但度量值始终为所有员工返回01.01.2023(首个日期):
Next Available Day = VAR CurrentEmployee = SELECTEDVALUE('employees_daily_load'[assignee]) VAR CurrentDate = SELECTEDVALUE('employees_daily_load'[Date]) VAR NextAvailableDay = CALCULATE( MIN(employees_daily_load[Date]), FILTER(employees_daily_load, 'employees_daily_load'[assignee] = CurrentEmployee && 'employees_daily_load'[TotalAssignedUnitsforDay] <= 50 && 'employees_daily_load'[Date] > CurrentDate ) ) RETURN NextAvailableDay
问题分析与修正
核心问题
- 列名不匹配:原表中的负载列是
TotalLoad (%),但代码中误用了TotalAssignedUnitsforDay,导致筛选条件完全失效,返回的是所有符合日期条件的最小日期。 - 未聚合每日总负载:原数据中同一日期同一员工有多条负载记录,直接筛选单条记录的负载值无法判断当日是否整体可用,必须先计算当日总负载。
修正后的DAX度量值
Next Available Day = VAR CurrentEmployee = SELECTEDVALUE('employees_daily_load'[assignee]) VAR CurrentDate = SELECTEDVALUE('employees_daily_load'[Date]) -- 先聚合每个员工每日的总负载 VAR DailyTotalLoad = ADDCOLUMNS( SUMMARIZE('employees_daily_load', 'employees_daily_load'[assignee], 'employees_daily_load'[Date]), "DailyTotal", SUM('employees_daily_load'[TotalLoad (%)]) ) -- 筛选符合条件的日期并取最小值 VAR NextAvailableDay = MINX( FILTER( DailyTotalLoad, [assignee] = CurrentEmployee && [DailyTotal] < 100 && [Date] > CurrentDate ), [Date] ) RETURN NextAvailableDay
关键说明
- 聚合每日负载:通过
SUMMARIZE+ADDCOLUMNS计算每个员工每日的总负载,确保判断的是当日整体负载是否低于100%。 - 修正列名:替换了代码中错误的列名,匹配原表的
TotalLoad (%)。 - 使用MINX筛选:在聚合后的数据集上直接筛选并取最小日期,避免上下文筛选冲突,逻辑更直观。
如果你的模型中已经有单独的日期维度表(推荐使用),可以进一步优化:
Next Available Day = VAR CurrentEmployee = SELECTEDVALUE('employees_daily_load'[assignee]) VAR CurrentDate = SELECTEDVALUE('Date'[Date]) VAR NextAvailableDay = MINX( FILTER( ALL('Date'[Date]), 'Date'[Date] > CurrentDate && CALCULATE(SUM('employees_daily_load'[TotalLoad (%)]), 'employees_daily_load'[assignee] = CurrentEmployee) < 100 ), 'Date'[Date] ) RETURN NextAvailableDay
内容的提问来源于stack exchange,提问作者zargawy
相关产品推荐
相关产品推荐

