Power BI如何创建返回层级且保留关联关系的自定义列
Power BI 成本科目层级标识自定义列实现方案
实现前先确认你的成本科目维度表已具备三个基础字段:科目唯一ID、父级科目ID、科目名称,这是父子层级追溯的必要前提,两种可落地的实现方案如下:
方案1:Power Query 自定义列(推荐,刷新性能更优)
适合数据量大、需要固定计算逻辑的场景,计算在数据刷新阶段完成,不会占用报表运行时资源:
- 打开Power Query编辑器,定位到你的成本科目表
- 选择「添加列」-「自定义列」,列名设为
层级标识,将以下代码粘贴到公式框,替换代码中对应的表名、字段名为你实际使用的名称即可:
let CurrentID = [科目ID], CurrentParentID = [父级科目ID], CurrentName = [科目名称], // 递归向上追溯当前节点的所有父级链路 LevelPath = List.Generate( () => [NodeID = CurrentID, PNodeID = CurrentParentID, NodeName = CurrentName, NodeLevel = 0], each [NodeID] <> null, each [ NodeID = [PNodeID], PNodeID = try 源表{Table.PositionOf(源表[科目ID], [PNodeID])}[父级科目ID] otherwise null, NodeName = try 源表{Table.PositionOf(源表[科目ID], [PNodeID])}[科目名称] otherwise null, NodeLevel = [NodeLevel] + 1 ], each [NodeName, NodeLevel] ), RootNode = List.Last(LevelPath), SiteWorksLevelGap = if RootNode[NodeName] = "SITE WORKS" then RootNode[NodeLevel] else null in if SiteWorksLevelGap = 0 then "Level 0" else if SiteWorksLevelGap = 1 then "Level 1" else if SiteWorksLevelGap = 2 then "Level 2" else if not IsNull(SiteWorksLevelGap) then "Level " & Text.From(SiteWorksLevelGap) else null
代码说明:逻辑会自动沿父级ID向上追溯到根节点,只要节点链路最终挂载在SITE WORKS节点下,就会自动计算相对层级,不会修改原有表的关联结构,你提到的ID为762的项只要父级链路匹配,就会正确返回归属762父级对应的Level 1标识。
方案2:DAX 计算列(适合快速调整场景)
不需要进入Power Query,直接在报表建模视图新建计算列即可,适合数据量较小的场景:
层级标识 = VAR NodePath = PATH('成本科目表'[科目ID], '成本科目表'[父级科目ID]) VAR SiteWorksID = LOOKUPVALUE('成本科目表'[科目ID], '成本科目表'[科目名称], "SITE WORKS") VAR SiteWorksPos = FIND(SiteWorksID, NodePath, , 0) VAR LevelCount = IF( SiteWorksPos > 0, (LEN(NodePath) - LEN(SUBSTITUTE(NodePath, "|", ""))) - (LEN(LEFT(NodePath, SiteWorksPos - 1)) - LEN(SUBSTITUTE(LEFT(NodePath, SiteWorksPos - 1), "|", ""))) ) RETURN IF(NOT ISBLANK(LevelCount), "Level " & LevelCount, BLANK())
结果校验规则
两种方案的返回结果完全匹配你的需求:
- SITE WORKS节点返回
Level 0 - SITE WORKS的直接子项(含Substructure、你提到的762对应父级下的子项)返回
Level 1 - Level 1节点的直接子项(含Excavation in unclassified soil/非分类土开挖)返回
Level 2 - 所有计算完全基于原有表的父子ID关联,不会破坏表和其他事实表的现有关系。
内容的提问来源于stack exchange,提问作者Project Insights
相关产品推荐
相关产品推荐

