DAX中FILTER函数括号对逻辑运算的影响及结果差异原因
关于DAX过滤条件中括号影响结果的问题
我需要编写DAX代码计算公司备件的最新使用日期,要求满足以下两个条件:
- SP_USED[Product Number] 等于 "92360122" 或 "92360136"
- 对应的SP_USED[Model Number (Adjusted)] 为 "XN-10"、"XN-20"、"XN-31" 或 "XR-10"
错误的代码(Code 1)
这段代码未按预期过滤数据,返回的是所有行的最大值,而非符合条件的行的最大值:
LUsedDateCombined = VAR currIB = SP_USED[Install Base] VAR maxDateLastUsed = CALCULATE( MAX(SP_USED[BRB Start Date]), FILTER( SP_USED, SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136" && SP_USED[Model Number (Adjusted)] = "XN-10" || SP_USED[Model Number (Adjusted)] = "XN-20" || SP_USED[Model Number (Adjusted)] = "XN-31" || SP_USED[Model Number (Adjusted)] = "XR-10" || SP_USED[Model Number (Adjusted)] = "XR-10" ), SP_USED[Install Base] = currIB ) RETURN FORMAT(maxDateLastUsed, "dd/mm/yyyy")
正确的代码(Code 2)
给型号条件添加括号后,代码返回了符合过滤条件的最大值:
LUsedDateCombined (Joanne) = VAR currIB = SP_USED[Install Base] VAR maxDateLastUsed = CALCULATE( MAX(SP_USED[BRB Start Date]), FILTER( SP_USED, SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136" && (SP_USED[Model Number (Adjusted)] = "XN-10" || SP_USED[Model Number (Adjusted)] = "XN-20" || SP_USED[Model Number (Adjusted)] = "XN-31" || SP_USED[Model Number (Adjusted)] = "XR-10" || SP_USED[Model Number (Adjusted)] = "XR-10") ), SP_USED[Install Base] = currIB ) RETURN FORMAT(maxDateLastUsed, "dd/mm/yyyy")
差异原因分析
核心问题在于DAX逻辑运算符的优先级:&&(逻辑与)的优先级高于||(逻辑或),DAX会先执行所有&&运算,再执行||运算。
Code 1的实际执行逻辑
没有括号的情况下,条件会被DAX自动解析为:
SP_USED[Product Number] = "92360122" || (SP_USED[Product Number] = "92360136" && SP_USED[Model Number (Adjusted)] = "XN-10") || SP_USED[Model Number (Adjusted)] = "XN-20" || SP_USED[Model Number (Adjusted)] = "XN-31" || SP_USED[Model Number (Adjusted)] = "XR-10"
这意味着只要型号是XN-20、XN-31或XR-10,无论产品编号是什么,都会被纳入计算范围,最终返回的是所有符合型号条件的行的最大日期,自然不符合预期。
Code 2的实际执行逻辑
给型号的||组添加括号后,强制DAX先计算括号内的型号条件,再与产品编号的&&结合,最终逻辑变为:
SP_USED[Product Number] = "92360122" || ( SP_USED[Product Number] = "92360136" && (SP_USED[Model Number (Adjusted)] = "XN-10" || ... || "XR-10") )
这就实现了预期的过滤逻辑:要么产品编号是92360122,要么产品编号是92360136且型号符合指定范围。
为何调整产品编号括号仍错误
如果给产品编号条件加括号、去掉型号条件的括号,比如写成:
(SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136") && SP_USED[Model Number (Adjusted)] = "XN-10" || SP_USED[Model Number (Adjusted)] = "XN-20" || ...
DAX依然会先执行&&运算,最终逻辑变为:
((Product=A || Product=B) && Model=C) || Model=D || Model=E || Model=F
这还是会把型号为XN-20、XN-31、XR-10的所有行纳入计算,结果自然错误。
内容的提问来源于stack exchange,提问作者Joanne Jeow
相关产品推荐
相关产品推荐

