转自微信
本文旨在通过求“父行汇总百分比“的案例,分享Power Pivot建模中遇到问题的解决思路和方法,顺便分享几个筛选函数的不同,包括ALL、ALLSELECTED、ISFILTERED和HASONEFILTER 。
在实际工作中,我们除了展示销售额数字以外,还经常需要通过百分比进行展现,让报表的读者很容易的获取某个城市的销售占比情况。我们可以通过Excel数据透视表的”值显示方式“ – “总计的百分比“快速得到这样的显示结果。
但这种方式只能在数据透视表里使用,比较局限。我们不能基于这个占比进行后续的其它计算。也不能在后续的展现里使用该占比,比如Power View 或 Power BI Desktop里。所以我们需要在Power Pivot模型里把这个度量值写出来。
过使用筛选函数 ALL,我们使分母不受数据透视表里的筛选上下文影响,结果如下:
难度升级一
公式返回了我们想要的结果。但是此时如果我们通过切片器筛选某个省份,我们看公式的结果:
由于公式里的ALL 函数对切片器里的筛选上下文进行了替换,强制返回整张表里所有的数据,导致无论我们如何筛选,报表里的百分比都是显示某个城市占所有销售额的占比。
如果我们希望只显示所选择的数据占比情况,则需要使用另外一个筛选函数ALLSELECTED, 我们新建公式如下:
由于ALLSELECTED只统计所有我们通过切片器选择的城市数据,可以让我们实现占比按照切片器的选择来显示。所以这种情况下ALLSELECTED更灵活。
难度升级二
假设此时我们在报表里使用层级,加入省份信息,我们看下结果:
对应的占比信息我们希望显示为”父行占比”。以广东为例,我们希望广东下面的广州和深圳分别显示销售额占广东省的占比,而不是全国的占比。而在省份级别的广东,我们希望显示广东在全国的销售占比。
由数据透视表显示方式生成的“销售额占比“,在省份级别是对的,但在城市级别的数字不对。我们可以通过调整显示方式为”父行汇总百分比“纠正。
对于度量值“ALL” 和“ALLSELECTED”我们需要对公式进行调整,由于ALL不够灵活,我们在这里把ALL先删除。
ALLSELECTED在城市级别是对的,但是在省份级别是错的。这是由于我们在公式里使用了“城市“的原因,
我们需要对省份级别使用如下公式:
这就要求我们需要先识别出数据所在的级别。我们需要引入另外一个函数ISFILTERED,通过ISFILTERED 来判断当前数据所在位置是省份级别还是城市级别。公式如下:
为了方便理解,我们把这两个度量值添加到透视表里看下结果:
我们看到,"ISFILTERED省份"在省份级别上是TRUE,说明该行数据被省份筛选。而"ISFILTERED城市"在该行是FALSE,说明改行数据没有被城市筛选(见上图中蓝色部分)。
而在下面的城市级别,"ISFILTED省份"和"ISFILTED城市"都是TRUE,说明该行数据同时被省份和城市筛选(见上图中黄色部分)。
基于此,我们对ALLSELECTED公式进行如下调整:
先通过ISFILTERED判断数据所在的位置,然后进行相应的占比计算。得到的结果如下:
这就是我们想要的父行汇总的百分比。
难度升级三
假设我们此时使用切片器对城市进行筛选,见下图,我们选择唐山,所有数据的显示都是正确的。
结果在省份级别出错了。我们知道以这种方式查看报告的人很少,但为了避免这种变态的场景出现,我们还需要对公式再进行一次调整。
为了排查错误,我们再次把“ISFILTERED省份”和“ISFILTERED城市”拿到透视表里来:
图中黄色标注部分,当我们选择跨省份的两个城市时,会造成ISFILTERED城市在省份级别变成TRUE,所以我们在“ISFILTERED&ALLSELECTED”里的公式就会错误把省份级别数据识别为城市级别,下图标注处:
为了解决这个问题,我们需要引入另外一个函数HASONEFILTER:
HASONEFILTER可以帮我们界定某个字段上的直接筛选值是否为一个。在本例中,当用户选择唐山和三亚时,“HASONEFILTER城市”可以帮我们判断此时省份所在行被城市的多个值筛选了(FALSE),见下图绿色部分:
通过这个判断,我们可以将公式更改为:
得到最终结果如下(绿色):
而这个结果,无论我们怎么筛选切片器都是返回正确的“父行汇总百分比”
通过这一系列的更改,我们最终通过HASONEFILTER得到了想要的结果。但需要注意的是这并不代表HASONEFILTER才是最好用的DAX函数,大家应该根据不同需求选择正确的函数。