基于父子ID在Power BI中创建层级切片器(兼容直连模式)
基于父子ID创建层级切片器:导入与直连模式解决方案
需求说明
需基于id与parent Id字段,利用name字段生成指定层级结构的切片器;曾尝试DAX PATH函数但在直连模式下无法使用,初步生成的层级列准确性不足,需获取导入、直连两种模式的可行方案。
示例数据
| id | parent Id | name |
|---|---|---|
| 1 | null | A |
| 2 | null | B |
| 3 | 1 | a1 |
| 4 | 1 | a2 |
| 5 | 3 | a1-1 |
| 6 | 3 | a1-2 |
| 7 | 4 | a2-1 |
| 8 | 4 | a2-2 |
| 9 | 2 | b1 |
| 10 | 2 | b2 |
| 11 | 9 | b1-1 |
| 12 | 9 | b1-2 |
| 13 | 10 | b2-1 |
| 14 | 10 | b2-2 |
期望切片器结构
- A(顶级)
- a1(二级)
- a1-1
- a1-2
- a2(二级)
- a2-1
- a2-2
- a1(二级)
- B(顶级)
- b1(二级)
- b1-1
- b1-2
- b2(二级)
- b2-1
- b2-2
- b1(二级)
一、导入模式解决方案
导入模式下可直接使用DAX的PATH系列函数生成层级列,步骤如下:
生成层级路径列
创建计算列,用PATH函数获取每个节点的完整路径:层级路径 = PATH('分类表'[id], '分类表'[parent Id])注:
parent Id为null的节点会被识别为顶级节点,路径仅包含自身id。提取各层级名称
通过PATHITEM提取路径中的各层级id,再用LOOKUPVALUE匹配对应名称,创建三个计算列:一级分类 = LOOKUPVALUE('分类表'[name], '分类表'[id], PATHITEM('分类表'[层级路径], 1, INTEGER)) 二级分类 = IF(PATHLENGTH('分类表'[层级路径])>=2, LOOKUPVALUE('分类表'[name], '分类表'[id], PATHITEM('分类表'[层级路径], 2, INTEGER)), BLANK()) 三级分类 = IF(PATHLENGTH('分类表'[层级路径])>=3, LOOKUPVALUE('分类表'[name], '分类表'[id], PATHITEM('分类表'[层级路径], 3, INTEGER)), BLANK())注:
PATHLENGTH用于判断节点所在层级,避免空值报错。创建层级切片器
- 选中
一级分类、二级分类、三级分类三个列,右键选择创建层次结构,命名为“分类层级”。 - 将该层次结构拖到切片器控件,自动生成折叠式层级切片器,匹配期望结构。
- 选中
二、直连模式解决方案
直连模式下DAX的PATH函数受限,优先采用数据源端预生成层级列的方案,或使用替代DAX逻辑:
方案1:数据源端预生成层级列(推荐)
在SQL数据源中通过递归CTE生成各层级名称,示例SQL代码:
WITH RECURSIVE 分类层级 AS ( SELECT id, parent_id, name, name AS 一级分类, CAST(NULL AS VARCHAR(50)) AS 二级分类, CAST(NULL AS VARCHAR(50)) AS 三级分类 FROM 分类表 WHERE parent_id IS NULL UNION ALL SELECT c.id, c.parent_id, c.name, cl.一级分类, CASE WHEN cl.二级分类 IS NULL THEN c.name ELSE cl.二级分类 END AS 二级分类, CASE WHEN cl.二级分类 IS NOT NULL THEN c.name ELSE NULL END AS 三级分类 FROM 分类表 c JOIN 分类层级 cl ON c.parent_id = cl.id ) SELECT * FROM 分类层级;
将生成的包含一级分类、二级分类、三级分类的表接入Power BI直连模式,直接按导入模式的方法创建层级切片器即可。
方案2:直连模式下的DAX替代方案
若无法修改数据源,可使用DAX递归变量生成层级(性能可能受限),示例计算列:
一级分类 = VAR CurrentID = '分类表'[id] VAR FindTopParent = CALCULATE( MAX('分类表'[name]), FILTER( ALL('分类表'), '分类表'[id] = PATHITEM(PATH('分类表'[id], '分类表'[parent Id]), 1, INTEGER) ) ) RETURN FindTopParent
注:此方法依赖直连数据源对PATH函数的支持(如SQL Server直连),若仍不支持,优先使用数据源端预生成方案。
内容的提问来源于stack exchange,提问作者Krishna Subhash Chandran Nair
相关产品推荐
相关产品推荐

