关于Power Pivot中“父行汇总百分比”的度量值写法

本文旨在通过求“父行汇总百分比“的案例,分享Power Pivot建模中遇到问题的解决思路和方法,顺便分享几个筛选函数的不同,包括ALL、ALLSELECTED、ISFILTERED和HASONEFILTER 。

前方高能预警…


下图是某公司基于各城市的销售额报表:

在实际工作中,我们除了展示销售额数字以外,还经常需要通过百分比进行展现,让报表的读者很容易的获取某个城市的销售占比情况。我们可以通过Excel数据透视表的”值显示方式“ – “总计的百分比“快速得到这样的显示结果。


结果如下:

但这种方式只能在数据透视表里使用,比较局限。我们不能基于这个占比进行后续的其它计算。也不能在后续的展现里使用该占比,比如Power View 或 Power BI Desktop里。所以我们需要在Power Pivot模型里把这个度量值写出来。

我们先使用All来写,公式如下:

通过使用筛选函数 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函数,大家应该根据不同需求选择正确的函数。


我们希望分享的是解决问题的思路和了解涉及到的几个函数的不同。

如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“ 从Excel到Power BI数据分析可视化 ”系列课程。或者关注我们的公众号( PowerPivot工坊 )后猛戳”在线学习”


*PowerPivot工坊原创文章,欢迎转载,请注明出处

-----------------------------------------------------------------------------------------------------------------------

延伸阅读:

在Power Pivot中使用DATEDIFF函数计算日期时间间隔

使用USERELATIONSHIP实现两表之间多个关系的调用

在Power Pivot中计算父行汇总百分比

图解Earlier函数

Power Pivot时间智能之YTD(年初至今累计)

一张图看懂微软Power BI系列组件

当Power BI遇上欧冠决赛

-----------------------------------------------------------------------------------------------------------------------

如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“ 从Excel到Power BI数据分析可视化 ”系列课程。或者关注我们的公众号( PowerPivot工坊 )后猛戳”在线学习”

发布于 2017-07-31 18:28

文章被以下专栏收录