如何在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 过滤后_最终
效果验证
运行上述代码后得到的结果和预期完全一致:
| enabled | country | color | count | vehicle |
|---|---|---|---|---|
| yes | DE | yellow | one | car |
| yes | IT | yellow | one | car |
扩展说明
- 后续如果要新增/修改过滤规则,只需要直接修改
RemoveRecordsByValue和KeepRecordsByValue两个配置表的内容,刷新查询即可自动生效,无需修改代码 - 支持任意字段的规则配置,不需要提前在代码中指定字段名
内容的提问来源于stack exchange,提问作者SimplePowerBIUser
相关产品推荐
相关产品推荐

