前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PowerBI父子层级问题处理一例

PowerBI父子层级问题处理一例

作者头像
陈学谦
发布2023-12-05 17:32:07
5900
发布2023-12-05 17:32:07
举报
文章被收录于专栏:学谦数据运营

问题

示例数据:

想要达成效果:

解决过程

第一步:父子层级问题常规步骤,新建计算列

详见:《DAX权威指南》P333

代码语言:javascript
复制
PATH = PATH(Sheet1[关键字],Sheet1[父级])
L1 = PATHITEM([PATH],1)
#2/3/4层相同写法
有几层 = PATHLENGTH([PATH])

将层次结构拖入矩阵:

接下来要解决两个问题,一是有的层级为空,需要去掉最终矩阵里的空白行;二是得到正确的对应列的值。

针对第一个问题,我们需要明确空白行出现的原因。拿A-8下面的两个空白行为例。

A-8下面有一个分支是两行空白,即这一支路层数为2。

而如果展开到A-8的下一层,实际上筛选了3个层级,3>2,这一行不应该展示,因此我们可以得出以下结论:

如果[层数]<[当前筛选深度],则不显示该行。

对应的的DAX度量值写法如下:

代码语言:javascript
复制
IF(MAX('Sheet1'[有几层])<[当前筛选深度],BLANK(),···

而当前筛选深度可以用ISINSCOPE来返回:

代码语言:javascript
复制
当前筛选深度 = ISINSCOPE(Sheet1[L1])+ISINSCOPE(Sheet1[L2])+ISINSCOPE(Sheet1[L3])+ISINSCOPE(Sheet1[L4])

比如我们写一个简单的度量值:

代码语言:javascript
复制
去掉空行 = IF(MAX('Sheet1'[有几层])<[当前筛选深度],BLANK(),1)

拖入矩阵,就可以看到空白的行消失了:

下一步就是如何返回每一层级所对应的其他两列的值了,也就是将以上度量值中的返回值“1”替换掉即可。

我们注意到,[概要]和[类型]两列都是基于[关键字]列来匹配,因此需要首先返回[关键字]列的值,代码如下:

代码语言:javascript
复制
#返回层级结构中的当前关键字
当前关键字 = 
SWITCH(
    [筛选深度],
    1,SELECTEDVALUE(Sheet1[L1]),
    2,SELECTEDVALUE(Sheet1[L2]),
    3,SELECTEDVALUE(Sheet1[L3]),
    4,SELECTEDVALUE(Sheet1[L4]))

接下来只要根据[当前关键字]对其他两列分别进行筛选即可:

代码语言:javascript
复制
#通过判断深度来筛选返回概要
概要 = 
var a=[当前关键字]
return 
IF(
  MAX('Sheet1'[有几层])<[当前深度],
  BLANK(),
  CALCULATE(
    MAX('Sheet1'[概要]),
    FILTER('Sheet1','Sheet1'[关键字]=a)
  )
)

拖入矩阵即可呈现想要的结果:

基本完成。再多说一点细节。

我们注意到,层级结构的列名显示为[L1],而且在可视化里无法修改,我们希望此处显示为[关键字层次]。

层级结构的列名显示为[L1]的原因是我们将第一层的计算列的名设置为[L1],那么只需要将该列重命名即可:

再次查看矩阵,已经达到了我们的预期:

结论

PowerBI中的层级问题和父子层级问题,在很多业务场景中十分普遍,不同的业务需求最终的度量值返回结果不同,但是一般而言,计算列的创建过程基本上一致。大家可以先掌握计算列的过程,再结合实际情况写出不同需求的度量值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档