Power BI如何筛选SDNo_≠0且无对应SD记录的Orders数据?
问题描述
- 现有两个关联表:
- SD表:包含
No、Date等列 - Orders表:包含
SDNo_、Date等列
- SD表:包含
- 两表通过
SD[No]与Orders[SDNo_]建立一对多关系(一个SD对应多个Orders) - 部分Orders表的
SDNo_值未在SD表的No列中存在 - 需求:制作切片器、按钮或其他控件,展示
SDNo_≠0且无对应SD表记录的Orders列表 - 已尝试的计算表公式均未成功(结果仍包含不符合要求的记录):
- 公式1:
FILTER( 'Orders', 'Orders'[SDNo_] <> 0 && ISBLANK(RELATED('SD'[No])))- 公式2:
FILTER( 'Orders', 'Orders'[SDNo_] <> 0 && ISBLANK( LOOKUPVALUE( 'SD'[No], 'SD'[No], 'Orders'[SDNo_] ) ) )- 公式3:
FILTER( 'Orders', 'Orders'[SDNo_] <> 0 && NOT( CONTAINS( 'SD', 'SD'[No], 'Orders'[SDNo_] ) ) ) - 疑问:
- 最佳实现方案是什么?
- 是否可以无需在Power Query中合并表来实现需求?
解决方案
一、无需Power Query合并的实现方法(推荐)
1. 正确的计算表公式
你之前的公式失效核心是关系上下文限制:一对多关系下,部分DAX函数的匹配判断会受筛选上下文影响,导致无匹配记录的判断失效。以下两种DAX写法可直接生成符合要求的计算表:
方法A:用COUNTROWS判断匹配存在性
无匹配Orders = FILTER( 'Orders', 'Orders'[SDNo_] <> 0 && COUNTROWS(RELATEDTABLE('SD')) = 0 )
通过RELATEDTABLE('SD')获取当前Orders记录对应的SD表匹配行数,行数为0则说明无对应记录。
方法B:用EXCEPT函数取差集
无匹配Orders = VAR ValidSDNos = VALUES('SD'[No]) VAR NonZeroOrders = FILTER('Orders', 'Orders'[SDNo_] <> 0) RETURN EXCEPT(NonZeroOrders, FILTER(NonZeroOrders, 'Orders'[SDNo_] IN ValidSDNos))
先提取所有有效SD编号,再筛选出非0的Orders记录,最后用EXCEPT排除掉有匹配的记录,直接得到目标列表。
生成计算表后,可基于该表创建切片器、表格可视化控件,直接展示目标订单。
2. 用度量值配合按钮/切片器实现动态筛选
如果不需要生成固定计算表,希望在原Orders表上动态切换筛选状态,可创建以下度量值:
是否为无匹配订单 = VAR CurrentSDNo = SELECTEDVALUE('Orders'[SDNo_]) RETURN IF( CurrentSDNo <> 0 && NOT(CurrentSDNo IN VALUES('SD'[No])), 1, 0 )
后续操作:
- 按钮控件:创建按钮,设置动作为「筛选」,选择该度量值并设置条件为
是否为无匹配订单 = 1,点击按钮即可切换到目标订单视图 - 切片器控件:将该度量值拖入切片器,选择「1」即可筛选出符合要求的订单
二、原公式失效原因说明
RELATED('SD'[No]):一对多关系下,RELATED仅能从「一」端获取匹配值,无匹配时返回空白,但计算表的全局上下文可能导致部分无匹配记录的判断逻辑失效LOOKUPVALUE:若存在多匹配值会直接报错,且无匹配时未指定DEFAULT参数,可能返回错误而非空白,导致ISBLANK判断失效CONTAINS:要求SD[No]与Orders[SDNo_]数据类型完全一致(如均为数值或均为文本),类型不匹配会导致匹配失败
内容的提问来源于stack exchange,提问作者EssentialMarie
相关产品推荐
相关产品推荐

