在PowerBI中,当某个字段作为图表的轴时,默认会对该字段进行分组去重,即作为轴的字段的值并不会出现重复。该默认行为可以适应大多数的场景,但在一些特殊场景中则需要更改该默认行为,使轴上出现重复值,此时就需要用到行标签功能。比如该场景:“不同人的姓名可能会重复,如果出现重复姓名,仍需要在轴上显示多个相同的姓名。”
行标签功能的使用
假设现在需要按客户姓名统计各客户的销售金额,其中客户的姓名存在重复。虽然客户姓名有重复,但此时图表的轴里默认只显示一个姓名,如下图所示,有两个都叫张三的客户,但表格里只显示一个张三:
假如现在需要在上图的表格中显示两个张三客户,那么可以通过行标签功能来实现。在模型关系视图中,选择客户表,然后在属性窗口中找到行标签,下拉选择客户姓名字段即可,设置完成后,在客户姓名字段的左边将会出现一个资料卡形状的图标。
行标签设置完成后,回到报表界面,结果如下图所示:
可以看到,结果与设置行标签之前一致,并且客户姓名字段的左边也没有资料卡形状的图标。这是因为只设置了行标签,而行标签生效的前提需要设置主键,即“键列”。
回到模型关系视图,将键列设置为客户ID,即将客户ID字段作为主键,如下图所示:
行标签与主键都设置完成后,再回到报表界面,即可看到表格中出现了两个张三客户,如下图所示:
行标签功能的原理
上面介绍了行标签功能的用法,非常简单,但随之而来的则是另一个问题:“为何设置了行标签之后图表的轴就允许出现重复值了?”。
为了解答这个问题,首先来观察一下两个张三对应的销售金额,从上面的结果中可以看到,虽然客户姓名都是张三,但其对应的销售金额是不一致的,从而带来了另一个问题,即:“PowerBI是如何区分相同的张三的?”。
其实这个问题的答案很简单,如果只通过客户姓名字段去区分那是区分不了的,因为大家的值都一致,都是张三。因此需要引入另一个字段来做区分,这个字段就是之前设置的主键,主键字段会绑定到行标签字段上,当行标签字段被用作图表的轴字段时,将隐藏式添加主键字段的筛选器,这与按列排序的副作用一致。
如下图所示,在设置了行标签与主键时(行标签生效的前提需要设置主键),由视觉对象的轴所提供的筛选器将有两个,在计算销售金额总计时,只移除客户姓名的筛选器是不够的,还有隐藏式添加的主键字段的筛选器在生效,即客户ID的筛选器,因此销售金额总计度量值在每一行的结果刚好是对应客户的销售金额。
在这种情况下,为了正确计算销售金额的总计,需要把行标签字段的筛选器与主键字段的筛选器都移除掉,如下图所示:
为方便对比,再来看看未设置行标签时的结果,此时不存在隐藏式添加的主键筛选器,因此计算销售金额总计时则只移除客户姓名的筛选器就够了,如下图所示:
以下是设置行标签前后的后台查询代码:
以上就是设置了行标签后就允许轴出现重复值的原理了。
行标签功能的注意事项
在使用行标签功能时,需要注意两个地方:
1、行标签生效的前提需要设置主键,否则即使设置了行标签字段也是不起作用的,此时也不会隐藏式添加主键字段的筛选器。
2、在设置了行标签与主键后,在进行图表交互或将行标签字段作为切片器时,传递给其他图表的筛选器将会是主键字段的筛选器,而不是行标签字段本身的筛选器。
如下图所示,将设置了行标签的客户姓名字段作为切片器时,传递给其他图表的筛选器虽然在界面上显示的是客户姓名字段本身的筛选器,但此时的销售金额总计度量值的结果却不正确,即使已经使用ALL函数移除了客户姓名字段上的筛选器。
但如果使用ALL函数移除客户ID字段上的筛选器,此时的销售金额总计则是正确的,如下图所示:
此时表格的后台查询代码如下图,可以明确的看到切片器传递的是主键字段上的筛选器,而不是行标签字段本身的筛选器。
因此,设置了行标签与主键后,在进行图表交互或将行标签字段作为切片器时,传递给其他图表的筛选器将会是主键字段的筛选器,而不是行标签字段本身的筛选器。
总结
当需要在轴上显示重复值时,行标签功能将会很有用,但需要深入掌握其背后的原理才不会掉进坑里,否则很容易就会出错。