1.ALL(Table)或ALL (Column[, Column[, …]])
函数作用:返回表中的所有行或者返回列中的所有值,同时忽略可能已应用的任何筛选器。此函数可用于清除筛选器并对表中的所有行创建计算。
应用场景:计算部分占总体的排名/百分比。
示例:要计算各城市的销售金额排名/占总销售额的百分比 。
例1.1 计算排名。
新建度量值:
排名 = RANKX('销售记录',SUM('销售记录'[金额]),,DESC)
得到结果:
得到所有排名均为1,很显然,结果是错误的。原因是销售城市对排名操作仍起到了筛选器的作用,换而言之,以上结果是每个城市的销售金额占每个城市的总金额的排名,实际上,我们需要的是每个城市的销售金额占所有城市的总金额的排名,因此要删除销售城市这个筛选器,ALL函数即可解决此问题。
新建度量值:
销售金额 = SUM('销售记录'[金额])
排名1 = RANKX(ALL('销售记录'[销售城市]),[销售金额],,DESC)
采用ALL函数,即可清除销售城市对计算结果的影响,得到结果:
例1.2 计算百分比。
新建度量值:
销售金额 = SUM('销售记录'[金额])
占比% = '销售记录'[销售金额]/CALCULATE('销售记录'[销售金额],ALL('销售记录'))
得到结果:
上述展示了单一层级,即销售城市层级下的销量占比,而实际上,销售城市上面还有一层销售区域,现在欲同时展示两个层级下的销量占比,该如何操作呢?
首先,我们先在界面右侧重新建立一个由销售区域和销售城市组成的新的层次结构(可直接拖动销售城市到销售区域上),如图1所示。
然后,将新建立的层次结构拖到行,然后点击可视化图形(矩阵)的右上角第四个按钮,展开层次结构中的所有下移级别,即可将所有层级全部展开。
最后,书写度量值。
占比% = '销售记录'[销售金额]/CALCULATE('销售记录'[销售金额],ALL('销售记录'))
分类占比% = '销售记录'[销售金额]/CALCULATE('销售记录'[销售金额],ALL('销售记录'[销售城市]))
注意这两个度量值的区别,区别在于占比%中的ALL('销售记录')清除了所有筛选器的筛选作用,得到的结果是各个区域、各个城市的实际占比,但是分类占比%中的ALL('销售记录'[销售城市])仅清除了[销售城市]对结果的筛选作用,因此,它的结果是各个城市占所在区域的占比,如下图所示。
这时,我们再想象一种业务场景,老板并不只想看部分占总体的占比,还想看部分占部分的占比,举个例子,老板既不想看费城销量占总体销量的占比,也不想看费城销量占所在区域的占比,而是想看费城的销量在费城、纽约、芝加哥三个城市中的销量占比,如何解决?
答案就是添加一个切片器,但又不仅仅是添加一个切片器就能解决的,还需要函数ALLSELECTED([<tableName> | <columnName>])。
2.ALLSELECTED([<tableName> | <columnName>])
函数作用:从当前查询的列和行中删除上下文筛选器,同时保留所有其他上下文筛选器或显式筛选器。
应用场景:解决上述问题。
新建度量值:
按筛选占总体% = '销售记录'[销售金额]/CALCULATE('销售记录'[销售金额],ALLSELECTED('销售记录'))
按筛选占分类% = '销售记录'[销售金额]/CALCULATE('销售记录'[销售金额],ALLSELECTED('销售记录'[销售城市]))
计算结果如下:
如图,切片器选中费城、纽约、芝加哥三个城市,以费城为例,分析这四个结果是如何得来的,已知总体销量为546。
占比%=费城销量156/总体销量546=28.57%。
分类占比%=费城销量156/东区销量277=56.32%。
按筛选占总体%=费城销量156/(费城销量156+纽约销量149+芝加哥销量121)=36.62%。
按筛选占分类%=费城销量156/(选中的东区城市销量:费城156+芝加哥121)=56.32%。
仅从值上来看,按筛选占分类%和分类占比%是相等的,但是意义却不尽相同,假如将切片器仅选中费城和纽约,那么此时的按筛选占分类%=费城销量156/(选中的东区城市销量:费城156)=100%,而分类占比依然是56.32%。
由此可见,占比的定义变化多端,大有文章,要正确使用ALL(Table)或ALL (Column[, Column[, …]])和ALLSELECTED([<tableName> | <columnName>])函数。
3.ALLEXCEPT(<table>,<column>[,<column>[,…]])
函数作用:删除表中除已应用于指定列的筛选器之外的所有上下文筛选器。
应用场景及示例:《合并同类项问题》篇有对该函数用法进行详细描述,再次不再赘述。详情请参照ALLEXCEPT函数用法-合并同类项问题。