You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel中通过配置表的多个动态条件过滤事实表?

实现方案

实现思路

  • 先将两个规则配置表按field字段分组,生成每个字段对应的规则值列表,无需硬编码字段名,后续修改配置无需调整代码
  • 先执行排除规则:删除所有匹配任意一条RemoveRecordsByValue规则的记录
  • 再执行保留规则:仅保留同时满足所有KeepRecordsByValue规则的记录

完整Power Query M代码

新建空白查询,粘贴以下代码即可直接运行,若你的表名和示例不一致,修改代码开头的表名引用即可:

let
    // 引用三个基础表,若你的表名不同请修改对应部分
    事实表 = FactsTable,
    排除规则表 = RemoveRecordsByValue,
    保留规则表 = KeepRecordsByValue,

    // 处理排除规则:按字段分组,生成【字段-需排除的值列表】映射
    排除规则分组 = Table.Group(排除规则表, "field", {{"排除值", each _[value]}}),
    排除规则记录 = Record.FromList(排除规则分组[排除值], 排除规则分组[field]),

    // 执行排除过滤:只要匹配任意一条排除规则就删除记录
    过滤后_排除 = Table.SelectRows(事实表, (row) => 
        List.AllTrue(
            List.Transform(Record.FieldNames(排除规则记录), (f) => 
                not List.Contains(Record.Field(排除规则记录, f), Record.Field(row, f))
            )
        )
    ),

    // 处理保留规则:按字段分组,生成【字段-允许保留的值列表】映射
    保留规则分组 = Table.Group(保留规则表, "field", {{"允许值", each _[value]}}),
    保留规则记录 = Record.FromList(保留规则分组[允许值], 保留规则分组[field]),

    // 执行保留过滤:必须满足所有字段的保留规则才留存
    过滤后_最终 = Table.SelectRows(过滤后_排除, (row) => 
        List.AllTrue(
            List.Transform(Record.FieldNames(保留规则记录), (f) => 
                List.Contains(Record.Field(保留规则记录, f), Record.Field(row, f))
            )
        )
    )
in
    过滤后_最终

效果验证

运行上述代码后得到的结果和预期完全一致:

enabledcountrycolorcountvehicle
yesDEyellowonecar
yesITyellowonecar

扩展说明

  • 后续如果要新增/修改过滤规则,只需要直接修改RemoveRecordsByValue和KeepRecordsByValue两个配置表的内容,刷新查询即可自动生效,无需修改代码
  • 支持任意字段的规则配置,不需要提前在代码中指定字段名

内容的提问来源于stack exchange,提问作者SimplePowerBIUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:57:05