如何将SQL IF语句转换为Power BI DAX计算列表达式
DAX 实现SQL条件判断的正确方法
原有写法的错误原因
你之前写的两个表达式无法得到正确结果,问题出在语法错误和逻辑缺项:
- 第一个写法:一是表名拼写错误,你写的表名是
Payments,实际表名为Payment;二是IF函数未定义不满足条件时的返回值,默认会返回空值而非你需要的0。 - 第二个写法:括号位置错误,
AND函数要求两个判断条件都写在函数括号内,你错误拆分了括号位置,导致语法解析失败。
前置检查
使用RELATED函数跨表取数前,必须先确认两表的关系:Account表为关系「一端」,Payment表为关系「多端」,关系通过account_id字段关联,且筛选方向从Account指向Payment,否则RELATED无法正常取值。
正确实现写法
写法1:IF + 逻辑与运算符(&&)
在Payment表中新建计算列,输入以下DAX代码:
_test = IF( Payment[payment] > 0 && RELATED('Account'[pv]) = RELATED('Account'[gv]), 1, 0 )
写法2:IF + AND函数
DAX的AND函数原生支持两个条件的逻辑与判断,和你的SQL逻辑完全对应:
_test = IF( AND( Payment[payment] > 0, RELATED('Account'[pv]) = RELATED('Account'[gv]) ), 1, 0 )
无IF的简化替代方案
DAX中逻辑判断返回的布尔值TRUE/FALSE可以直接通过INT函数转为1/0,不需要嵌套IF函数,写法更简洁:
_test = INT( Payment[payment] > 0 && RELATED('Account'[pv]) = RELATED('Account'[gv]) )
关系异常时的兼容写法
如果因为模型关系设置问题导致RELATED函数报错,可以用LOOKUPVALUE手动匹配Account表的字段值,不需要依赖现有关系:
_test = VAR current_acc = Payment[account_id] VAR acc_pv = LOOKUPVALUE(Account[pv], Account[account_id], current_acc) VAR acc_gv = LOOKUPVALUE(Account[gv], Account[account_id], current_acc) RETURN INT(Payment[payment] > 0 && acc_pv = acc_gv)
注:按你给出的SQL逻辑校验样例数据,account_id为128的payment记录满足「payment>0、pv=gv」的条件,应返回1,你提供的样例中该条记录_test值为0是之前错误计算的结果,用上述正确写法即可得到符合逻辑的结果。
内容的提问来源于stack exchange,提问作者Let Soo Gas
相关产品推荐
相关产品推荐

