Power BI字段参数的分组与引用

2022-07-13 15:53:11 浏览数 (2)

Power BI 2022年5月更新的字段参数功能业务使用价值巨大,以至于本号连续更新相关内容,以下是前情提要:

Power BI字段参数基础

Power BI字段参数如何设置条件格式

Power BI字段参数如何合并同类指标

Power BI字段参数如何设置辅助线

本文主要解决两个问题,一是字段参数涉及的指标很多,如何快速分类或查找,二是如何引用字段参数表的列进行深度应用。在正式开始之前,首先展示下字段参数表的特性。

  1. 字段参数表的与众不同之处

在建模选项卡下,新建字段参数,添加一个切片器,我们可以实现动态切换维度或者指标(不了解基础操作可参考这个视频:Power BI字段参数用于存货分析)。

此时,在Power B中会自动生成一个字段参数表,本例包含以下三列:重新命名的指标名称,指标对应的度量值,以及排序索引。第一列默认显示,用于表格或者图表动态切换,后两列默认隐藏,也可以自行选择不隐藏。

从这个表的公式看,这是一个普通的表,你也可以建模选项卡下自己编写DAX创建一个:

如下指标1表,无论是公式内容还是显示内容,看上去和字段参数创建的表没有什么不同。

但是,你自己用DAX写的表(如下Value1放入表格),放入表格或图表时,无法像字段参数创建的表那样实现动态切换,会报错。

也就是说,DAX的表和字段参数的表外表一样,但是前者没有灵魂。新建字段参数,点击“创建”按钮的一刹那,生成的字段参数表有了神奇的能力。

这种魔性主要体现在字段参数表的第一列上,也就是被动态引用的这列:

把这三列我们对应新建三个度量值:

代码语言:javascript复制
显示_指标 = SELECTEDVALUE('指标'[指标]) 
显示_度量值 = SELECTEDVALUE('指标'[度量值]) 
显示_索引 = SELECTEDVALUE('指标'[索引])

增加指标切片器,将以上三个度量值放入卡片图,神奇的事情发生了(2022年5月版本,不排除后续有变化):加载了显示_指标度量值的卡片无法正常运作。

也就是说,指标这个列在相同的外表下,有不同之处。接下来,在字段参数表把“指标”列复制一份:

接着把指标复制列放入卡片图,可以看到复制的内容一模一样的列可以正常显示。

2. 字段参数分组及查找


如果指标很多,字段参数的单列显示不利于快速定位,分组是一种解决方法。在生成的字段参数表后,手动加一列分组:

将分组和指标列都放入切片器,可以看到指标进行了归类:

默认情况下,分组显示顺序可能不合适,为分组也加个索引:

以上读者可能发现,字段参数表可以被手动修改,但是不可以被从零开始手动DAX创建。

分组解决了一部分指标过多的查看问题,但是还不利于单个指标的快速定位。此时Text Filter视觉对象可以派上用场。

将“指标”列放入Text Filter,搜索客单,可以看到指标被精确查找到:

3. 引用字段参数列


字段参数表不仅仅只是用来切片,还可以在此基础上进行再创作。比如,利用字段参数的列合并次级指标为一个度量值(Power BI字段参数合并同类型指标),比如,为使用字段参数的图表增加辅助线(Power BI字段参数情境下的辅助线策略)

如前文介绍,因“指标”列(目前202206)无法被SELECTEDVALUE这样的函数引用,因此前期分享的文章我们引用的是索引列:

代码语言:javascript复制
多指标排名 = 
VAR _RANK =
SWITCH (
        SELECTEDVALUE ( '指标'[索引] ),
0, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售业绩] ),
1, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售笔数] ),
2, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.客单量] ),
3, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.客单价] ),
4, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售折扣] ),
5, RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.业绩达成率] ),
        BLANK ()
    )
RETURN
IF ( HASONEVALUE ( '店铺资料'[店铺名称] ), _RANK, BLANK () )

但是,引用索引列有个重大BUG,我因为展示需求,调整了字段参数的索引顺序,但是忘了调整关联指标的度量值,结果就会造成引用错误。例如,销售笔数的索引我从1调整到了2,但是多指标排名的度量值并未调整,结果排名计算错误。

因此可以使用度量值列,但为了简洁,建议将指标列完全复制一份。

这样,多指标排名度量值可以变为:

代码语言:javascript复制
多指标排名 = 
VAR _RANK =
SWITCH (
        SELECTEDVALUE ( '指标'[指标复制] ),
"销售业绩", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售业绩] ),
"销售笔数", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售笔数] ),
"客单量", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.客单量] ),
"客单价", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.客单价] ),
"销售折扣", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.销售折扣] ),
"业绩达成率", RANKX ( ALL ( '店铺资料'[店铺名称] ), [M.业绩达成率] ),
        BLANK ()
    )
RETURN
IF ( HASONEVALUE ( '店铺资料'[店铺名称] ), _RANK, BLANK () )

这种方式不仅解决了索引变更问题,而且更为易读。

以上。


0 人点赞