如何在Power BI中基于动态行数的Conditions表筛选Order表?
动态条件筛选Orders表的Power BI实现方案
需求说明
基于Conditions表动态筛选Order表,Conditions表行数支持动态变化,筛选逻辑需满足:
- Conditions表单行内的BillTo、Shipper、Receiver字段为AND关系;
- 所有行的筛选结果做UNION合并(即逻辑OR关系)。
表结构
Conditions表
| ConditionSet | BillTo | Shipper | Receiver |
|---|---|---|---|
| C1 | B1, B2 | ||
| C2 | S1, S3 | R3 | |
| C3 | B3, B4 | S3, S4 | R2,R3,R4 |
Order表
| OrderNo | BillTo | Shipper | Receiver |
|---|---|---|---|
| 1 | B4 | S4 | R4 |
| 2 | B2 | S3 | R2 |
| 3 | B2 | S3 | R1 |
| 4 | B4 | S1 | R3 |
| 5 | B3 | S4 | R1 |
| 6 | B5 | S3 | R3 |
| 7 | B1 | S3 | R5 |
| 8 | B2 | S3 | R6 |
| 9 | B4 | S5 | R6 |
| 10 | B3 | S3 | R2 |
筛选规则
- 单条条件行内:BillTo、Shipper、Receiver为AND条件(空字段表示不对该列做筛选);
- 多条条件行之间:结果做UNION合并(即逻辑OR)。
示例筛选结果
- C1筛选结果:2,3,7,8
- C2筛选结果:4,6
- C3筛选结果:10
- 最终合并结果:2,3,4,6,7,8,10
等效SQL逻辑
SELECT OrderNo FROM Orders WHERE (BillTo IN ('B1', 'B2')) OR --C1 (Shipper IN ('S1', 'S3') AND Receiver IN ('R3')) OR --C2 (BillTo IN ('B3', 'B4') AND Shipper IN ('S3', 'S4') AND Receiver IN ('R2','R3','R4')) --C3
Power BI实现方案
步骤1:拆分Conditions表的多值字段
首先处理Conditions表中逗号分隔的多值字段,拆分为行结构:
- 在Power Query编辑器中导入Conditions表;
- 对BillTo、Shipper、Receiver列分别执行拆分列>按分隔符>逗号>拆分为行;
- 筛选删除拆分后生成的空值行;
- 将处理后的表重命名为
Conditions_Split。
步骤2:创建匹配判断度量值
在数据模型中创建度量值,用于判断单个订单是否满足任意一组条件:
IsMatch = VAR CurrentBillTo = SELECTEDVALUE(Orders[BillTo]) VAR CurrentShipper = SELECTEDVALUE(Orders[Shipper]) VAR CurrentReceiver = SELECTEDVALUE(Orders[Receiver]) RETURN COUNTROWS( FILTER( SUMMARIZE( Conditions_Split, Conditions_Split[ConditionSet], "BillToMatch", IF(ISBLANK(MAX(Conditions_Split[BillTo])), TRUE(), CurrentBillTo IN VALUES(Conditions_Split[BillTo])), "ShipperMatch", IF(ISBLANK(MAX(Conditions_Split[Shipper])), TRUE(), CurrentShipper IN VALUES(Conditions_Split[Shipper])), "ReceiverMatch", IF(ISBLANK(MAX(Conditions_Split[Receiver])), TRUE(), CurrentReceiver IN VALUES(Conditions_Split[Receiver])) ), [BillToMatch] && [ShipperMatch] && [ReceiverMatch] ) ) > 0
步骤3:应用动态筛选
- 在报表页面添加Orders表的OrderNo字段;
- 添加筛选器,选择度量值
IsMatch并设置为“等于True”; - 当Conditions表新增/删除条件行时,刷新数据模型即可自动适配筛选逻辑。
可选:生成匹配订单号列表
若需直接展示符合条件的订单号,可创建以下度量值:
MatchedOrderNos = CONCATENATEX( FILTER(Orders, [IsMatch]), Orders[OrderNo], ", " )
内容的提问来源于stack exchange,提问作者Anshuman Sarangi
相关产品推荐
相关产品推荐

