问题
示例数据:
想要达成效果:
解决过程
第一步:父子层级问题常规步骤,新建计算列
详见:《DAX权威指南》P333
PATH = PATH(Sheet1[关键字],Sheet1[父级])
L1 = PATHITEM([PATH],1)
#2/3/4层相同写法
有几层 = PATHLENGTH([PATH])
将层次结构拖入矩阵:
接下来要解决两个问题,一是有的层级为空,需要去掉最终矩阵里的空白行;二是得到正确的对应列的值。
针对第一个问题,我们需要明确空白行出现的原因。拿A-8下面的两个空白行为例。
A-8下面有一个分支是两行空白,即这一支路层数为2。
而如果展开到A-8的下一层,实际上筛选了3个层级,3>2,这一行不应该展示,因此我们可以得出以下结论:
如果[层数]<[当前筛选深度],则不显示该行。
对应的的DAX度量值写法如下:
IF(MAX('Sheet1'[有几层])<[当前筛选深度],BLANK(),···
而当前筛选深度可以用ISINSCOPE来返回:
当前筛选深度 = ISINSCOPE(Sheet1[L1])+ISINSCOPE(Sheet1[L2])+ISINSCOPE(Sheet1[L3])+ISINSCOPE(Sheet1[L4])
比如我们写一个简单的度量值:
去掉空行 = IF(MAX('Sheet1'[有几层])<[当前筛选深度],BLANK(),1)
拖入矩阵,就可以看到空白的行消失了:
下一步就是如何返回每一层级所对应的其他两列的值了,也就是将以上度量值中的返回值“1”替换掉即可。
我们注意到,[概要]和[类型]两列都是基于[关键字]列来匹配,因此需要首先返回[关键字]列的值,代码如下:
#返回层级结构中的当前关键字
当前关键字 =
SWITCH(
[筛选深度],
1,SELECTEDVALUE(Sheet1[L1]),
2,SELECTEDVALUE(Sheet1[L2]),
3,SELECTEDVALUE(Sheet1[L3]),
4,SELECTEDVALUE(Sheet1[L4]))
接下来只要根据[当前关键字]对其他两列分别进行筛选即可:
#通过判断深度来筛选返回概要
概要 =
var a=[当前关键字]
return
IF(
MAX('Sheet1'[有几层])<[当前深度],
BLANK(),
CALCULATE(
MAX('Sheet1'[概要]),
FILTER('Sheet1','Sheet1'[关键字]=a)
)
)
拖入矩阵即可呈现想要的结果:
基本完成。再多说一点细节。
我们注意到,层级结构的列名显示为[L1],而且在可视化里无法修改,我们希望此处显示为[关键字层次]。
层级结构的列名显示为[L1]的原因是我们将第一层的计算列的名设置为[L1],那么只需要将该列重命名即可:
再次查看矩阵,已经达到了我们的预期:
结论
PowerBI中的层级问题和父子层级问题,在很多业务场景中十分普遍,不同的业务需求最终的度量值返回结果不同,但是一般而言,计算列的创建过程基本上一致。大家可以先掌握计算列的过程,再结合实际情况写出不同需求的度量值。
本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!