DAX中的ALL函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jessica_seiya/article/details/82459815

ALL函数筛选器类型函数中比较特殊的一个函数。使用ALL函数的目的正好与FILTER函数相反,这个函数的功能是可以去除指定表单或列上应用的筛选器,让表单或者列中的所有数据都可以作为函数运算的上下文来参与计算。

ALL函数定义:

ALL( {<table> | <column>[, <column>[, <column>[,…]]]} )
  • 参数:
  • < table >:需要清除筛选条件的表单。该表单只能是一个原始表单或计算表单,不能填写可以返回表单的表达式。
  • < column>(选填项):需要清除筛选条件的列,如果有多个列时,用逗号进行分割。该列只能是一个原始列或计算列,不能填写可以返回列的表达式。
  • 返回值:被移除全部过滤条件的表单或列。
  • 说明:
    – 通过ALL函数的参数只有< table >,没有具体列名,则ALL函数会清除该表单中所有列上的过滤条件。
    – 如果ALL函数的参数只有一个具体的列,则返回结果是去掉当前列上所有筛选条件后,所有非重复数据组成的新列。
    – ALL函数不能单独使用,只能作为用来清除表单或列上的筛选条件的子函数,被其他函数所使用。

ALL函数最常见的应用场景就是求某项元素在总体元素中所占的百分比。例如下图是一张产品销售量表单,如果要计算每种产品销售量的百分比,则需要用单个产品销售量去除以所有产品销售总量来获得。

这里写图片描述

要计算每种产品的销售总量比较简单直接,只需用SUM函数创建一个度量值,之后再创建一个可视化表单利用Product列做筛选上下文条件即可。但是如果要在该表上获得所有产品销售总量,则必须去掉筛选上下文,用全部销售额数据汇总,因此需要借助ALL函数功能进行运算。参考公式如下:

Amount% =
DIVIDE (
    SUM ( SalesInfo[Amount] ),
    SUMX ( ALL ( SalesInfo ), SalesInfo[Amount] )
)

这里写图片描述

在这个公式中,作为分子的SUM函数的计算结果受到当前表单中的筛选上下文影响,只会针对当前行的Product值去找对应的Amount值进行求和计算。而SUMX函数中因为使用了ALL函数去清空了SalesInfo表中所有的筛选条件,也就是说,此时当前可视化表单中的筛选上下文已经无法对SUMX函数的运算范围进行影响,因此SUMX函数会根据ALL函数的结果对原始表单中Amount列下所有数据进行求和运算,从而获得所有产品销售的总量。

上一个公式中ALL函数的参数使用了SalesInfo表单,如果将公式修改为用SalesInfo下的Amount列作为参数,则会获得下图所示的结果,与预期结果不一致。

Amount%_New =
DIVIDE (
    SUM ( SalesInfo[Amount] ),
    SUMX ( ALL ( SalesInfo[Amount] ), SalesInfo[Amount] )
)

这里写图片描述

虽然ALL函数中使用一个表单列作为参数可以用来去除应用在当前列上的过滤条件,但其返回结果是原始列中所有唯一值组成的新列,包含一个去重复数据的过程。在原始表中Amount列中有重复数据(200出现了3次,100出现了2次),这样,去重之后的求和结果已经不再是所有产品销售的总量。因此用该结果作为分母就无法获得正确的产品销售百分比。

猜你喜欢

转载自blog.csdn.net/jessica_seiya/article/details/82459815