PowerBI中跨时段计算误工天数的DAX度量值异常问题求助
PowerBI度量值计算误工天数:四月数据不显示问题排查与解决
问题背景
需构建健康安全仪表盘,统计员工因事故的误工工作日数:
- 跨月事故需拆分到对应月份统计(如3月26日事故、4月3日复工,3月计6天、4月计3天)
- 现有两张表:工作日日历表
CalendarioBaja(含日期字段Date)、事故表Eventos(含员工ID、FechaBaja(误工起始日)、FechaAlta(复工日))
用物理表生成法(GENERATE创建Working days lost表)能正常在矩阵中按月份展示数据,但改用度量值时,总计正确但四月数据不显示:
// 原问题度量值 JP = COUNTROWS( GENERATE( Eventos, FILTER( CalendarioBaja, CalendarioBaja[Date]>=Eventos[FechaBaja] && CalendarioBaja[Date]<=Eventos[FechaAlta] ) ) )
问题原因
原度量值的FILTER(CalendarioBaja, ...)会受矩阵的日期上下文(如四月筛选)限制:
- 当矩阵筛选四月时,
CalendarioBaja已被过滤为仅四月日期 GENERATE遍历所有事故行时,跨月事故(如3月起始、4月结束)的FechaBaja是3月,此时FILTER逻辑上能筛选出四月内符合条件的日期,但生成的表未与矩阵的日期层级建立正确关联,导致计数无法映射到四月的行中- 总计正确是因为总计无日期筛选,
CalendarioBaja取全量数据,能统计所有符合条件的工作日
解决方案
方案1:SUMX逐个计算单事故的周期内误工天数
通过遍历每个事故,计算其在当前筛选周期(如四月)内的有效工作日数:
JP = SUMX( Eventos, VAR 事故起始日 = Eventos[FechaBaja] VAR 事故结束日 = Eventos[FechaAlta] VAR 当前周期起始 = MIN(CalendarioBaja[Date]) VAR 当前周期结束 = MAX(CalendarioBaja[Date]) // 取事故周期与当前筛选周期的交集,统计工作日数 RETURN COUNTROWS( FILTER( CalendarioBaja, CalendarioBaja[Date] >= MAX(事故起始日, 当前周期起始) && CalendarioBaja[Date] <= MIN(事故结束日, 当前周期结束) ) ) )
方案2:GENERATE配合CALCULATETABLE保留上下文
用CALCULATETABLE结合ALLSELECTED,确保外部日期筛选上下文被正确传递,同时筛选每个事故对应的工作日:
JP = COUNTROWS( GENERATE( Eventos, CALCULATETABLE( CalendarioBaja, CalendarioBaja[Date] >= Eventos[FechaBaja], CalendarioBaja[Date] <= Eventos[FechaAlta], ALLSELECTED(CalendarioBaja) ) ) )
验证说明
两种方案均能正确拆分跨月事故的误工天数到对应月份,矩阵中各月份数据会正常显示,同时总计结果与物理表生成法一致。
内容的提问来源于stack exchange,提问作者Diego Monge
相关产品推荐
相关产品推荐

