如何在Power BI中实现非层级BOM表的递归查询与筛选?
在Power BI中实现BOM层级递归查询(基于切片器选择)
核心需求
基于TESTPROD表(含cod_Father、cod_Son、Qty列),通过Power BI切片器选择父物料后,自动递归展开所有层级的子物料,汇总成一张完整的BOM结构表。
实现步骤
1. 配置切片器
插入切片器控件,关联TESTPROD表的cod_Father列,用于选择需要查询的父物料。
2. 创建递归计算表
在Power BI的模型视图中,点击「新建表」,粘贴以下DAX代码,生成自动递归的BOM结果表:
BOM完整结构 = VAR 选择的父项 = SELECTEDVALUE('TESTPROD'[cod_Father]) VAR 递归查找 = FUNCTION(当前父项) -- 获取当前父项的直接子项 VAR 直接子项 = FILTER('TESTPROD', 'TESTPROD'[cod_Father] = 当前父项) -- 递归查询子项的下一级子项 VAR 下级递归结果 = IF(NOT ISEMPTY(直接子项), GENERATE( 直接子项, 递归查找([cod_Son]) ) ) -- 合并当前层级子项与下级递归结果 RETURN UNION(直接子项, 下级递归结果) END -- 仅在选择父项后返回结果,否则返回空表 RETURN IF(NOT ISBLANK(选择的父项), 递归查找(选择的父项), BLANK())
3. 适配多选场景(可选)
如果需要支持切片器多选父物料,可使用以下DAX代码替代:
BOM完整结构(多选) = VAR 选择的父项列表 = VALUES('TESTPROD'[cod_Father]) VAR 递归查找 = FUNCTION(当前父项) VAR 直接子项 = FILTER('TESTPROD', 'TESTPROD'[cod_Father] = 当前父项) VAR 下级递归结果 = IF(NOT ISEMPTY(直接子项), GENERATE( 直接子项, 递归查找([cod_Son]) ) ) RETURN UNION(直接子项, 下级递归结果) END -- 遍历所有选中的父项,合并递归结果 VAR 所有选中BOM = GENERATE(选择的父项列表, 递归查找([cod_Father])) RETURN IF(ISEMPTY(选择的父项列表), BLANK(), 所有选中BOM)
4. 可视化展示
插入表格可视化控件,选择生成的「BOM完整结构」表中的cod_Father、cod_Son、Qty列。此时在切片器中选择父物料,表格会自动展示该物料所有层级的子项及对应数量。
注意事项
- 若TESTPROD表存在循环引用(如A是B的父项,B又是A的父项),递归会陷入死循环,需提前清理数据中的循环关系。
- 若数据量较大,递归查询可能影响性能,建议对父项列建立索引优化查询速度。
内容的提问来源于stack exchange,提问作者buzinaro
相关产品推荐
相关产品推荐

