如何在Power BI DAX中实现SQL风格的IN子查询筛选逻辑
解决方案:筛选包含指定取消状态订单的所有FACT记录
问题回顾
需要筛选FACT表中所有关联到同一ORDER_NUMBER的行,且该订单下至少存在一条FACT记录满足:关联的DIM_STATUS表中STATUS = "cancelled"且REASON <> "error"。无法调整现有数据模型,此前尝试的计算列因循环依赖报错。
方案1:创建计算表存储符合条件的订单号
创建一个计算表专门存储满足条件的ORDER_NUMBER,之后可直接将该表作为筛选器关联到DIM_ORDER表,实现全局或可视化级别的筛选。
DAX代码:
Valid_Cancelled_Orders = DISTINCT( SELECTCOLUMNS( FILTER( NATURALINNERJOIN(FACT, DIM_ORDER), RELATED(DIM_STATUS[STATUS]) = "cancelled" && RELATED(DIM_STATUS[REASON]) <> "error" ), "ORDER_NUMBER", DIM_ORDER[ORDER_NUMBER] ) )
使用方式:
- 计算表创建完成后,在数据模型中建立
Valid_Cancelled_Orders[ORDER_NUMBER]与DIM_ORDER[ORDER_NUMBER]的单向关系(从计算表指向DIM_ORDER)。 - 将
Valid_Cancelled_Orders[ORDER_NUMBER]拖入可视化的筛选器面板,选择“全部”即可自动筛选出所有关联这些订单的FACT记录。
方案2:创建度量值作为可视化筛选器
如果不需要额外的表,可创建一个度量值,通过可视化级别的筛选条件(设置为>0)实现需求,灵活性更高。
DAX代码:
Has_Valid_Cancelled_Line = VAR Current_Order = SELECTEDVALUE(DIM_ORDER[ORDER_NUMBER]) RETURN CALCULATE( COUNTROWS(FACT), ALL(FACT), -- 清除当前FACT表的上下文,避免循环依赖 RELATED(DIM_ORDER[ORDER_NUMBER]) = Current_Order, RELATED(DIM_STATUS[STATUS]) = "cancelled", RELATED(DIM_STATUS[REASON]) <> "error" )
使用方式:
- 在任意可视化的筛选器面板中,点击“添加筛选器”,选择“度量值”,找到
Has_Valid_Cancelled_Line。 - 设置筛选条件为“大于”,值输入
0,应用后即可显示符合要求的FACT记录。
为什么之前的计算列会报错?
之前的计算列在FACT表中引用RELATED(DIM_ORDER[ORDER_NUMBER])后,又通过FILTER('FACT', ...)再次关联自身表,导致数据模型出现循环依赖。上述方案通过清除上下文(度量值)或独立存储订单号(计算表),避免了循环引用问题。
内容的提问来源于stack exchange,提问作者jottbe
相关产品推荐
相关产品推荐

