DAX变量范围异常:如何使变量获取单个员工的雇佣与离职日期
问题分析与解决方案
你的核心问题是:外层定义的Hire和Term变量是基于整个表的上下文计算的,而非SELECTCOLUMNS迭代时的单行上下文,所以返回的是全表的最小日期,而非单个员工的对应日期。
修正后的DAX代码
Employment Cases = VAR PeriodStart = DATE(2022, 01, 01) VAR PeriodEnd = DATE(2022, 03, 31) VAR ReportPeriod = DATEDIFF(PeriodStart, PeriodEnd, MONTH) RETURN SELECTCOLUMNS ( attr_Tkpr_vw, "EmpID", attr_Tkpr_vw[TkprNumber], "Hire", attr_Tkpr_vw[TkprDateHire], "Term", attr_Tkpr_vw[TkprDateTerm], "Hire Test", attr_Tkpr_vw[TkprDateHire], "Term Test", attr_Tkpr_vw[TkprDateTerm], "Employment Period", // 将依赖单行上下文的变量移至SELECTCOLUMNS内部 VAR Hire = attr_Tkpr_vw[TkprDateHire] VAR Term = attr_Tkpr_vw[TkprDateTerm] VAR S3 = DATEDIFF(Hire, PeriodEnd, MONTH) / ReportPeriod VAR S4 = DATEDIFF(Hire, Term, MONTH) RETURN SWITCH ( TRUE (), // 简化多条件逻辑写法 attr_Tkpr_vw[TkprDateHire] >= PeriodStart && attr_Tkpr_vw[TkprDateHire] <= PeriodEnd && attr_Tkpr_vw[TkprDateTerm] >= PeriodEnd, S3, attr_Tkpr_vw[TkprDateHire] >= PeriodStart && attr_Tkpr_vw[TkprDateHire] <= PeriodEnd && attr_Tkpr_vw[TkprDateTerm] >= PeriodStart && attr_Tkpr_vw[TkprDateTerm] <= PeriodEnd, S4 ) )
关键修正点
- 变量作用域调整:将依赖单行员工数据的
Hire、Term、S3、S4移至SELECTCOLUMNS内部的Employment Period计算逻辑中。此时这些变量会随着SELECTCOLUMNS的逐行迭代,基于当前员工的行上下文计算值。 - 简化逻辑判断:用
&&替代多层嵌套的AND,提升代码可读性。 - 全局变量保留:
PeriodStart、PeriodEnd、ReportPeriod是全局固定值,放在外层定义即可,无需每行重复计算。
内容的提问来源于stack exchange,提问作者Bryon Scruggs
相关产品推荐
相关产品推荐

