ALLCROSSFILTERED函数一般不常用,因为在一般情况下可以使用ALL函数来代替,但是在某些较特殊的模型和应用场景中,ALLCROSSFILTERED函数的作用就显得很重要了。因此,本篇文章将对ALLCROSSFILTERED函数的作用做一个详细说明。


  由于ALLCROSSFILTERED函数与ALL函数在某些地方很相像,因此本文主要是对这两个函数的行为做一个比较,当然,本文会着重介绍ALLCROSSFILTERED函数。下面先来看一下这两个函数的语法结构与函数作用:

  ALLCROSSFILTERED函数:

  • 语法:
ALLCROSSFILTERED ( <TableName> )
  • 作用:

  ALLCROSSFILTERED只能用作筛选调节器,而不能用作表函数,将移除参数所指定的表的扩展表上的所有筛选器。此外,还会移除不基于扩展表来实现筛选行为的相关筛选器。换句话说,ALLCROSSFILTERED函数会移除任何能影响到其参数所指定表的筛选器。

  上述的相关筛选器并不通过扩展表原理实现筛选,而是通过DAX引擎内部所注入的特殊筛选代码来实现筛选行为。若不是通过扩展表原理来理解筛选上下文,而是通过关系的传播来理解,那么你可以忽略DAX引擎内部的特殊行为,你依然可以采用你固有的思维来理解筛选上下文,但是明确DAX引擎内部的特殊行为这一点很重要。

  ALL函数:

  • 语法:
ALL ( <TableName> | [ <ColumnName> , [ <ColumnName>, [ <ColumnName>, [ … ] ] ] )
  • 作用:

  ALL函数有两种用法,一种是作为表函数,另一种则是作为筛选调节器,ALL的作用具体如下:

  1、若将ALL用作表函数,将返回参数所指定的表中的所有行,或参数所指定的列的所有值去重后的单列表,忽略任何筛选器;

  2、若将ALL用作筛选调节器,将移除参数所指定的表的扩展表或参数所指定的列上的所有筛选器。


  下面来回顾一下扩展表与上级表的相关内容:

  某张表的扩展表包含了该表的所有列,以及该表的所有上级表的所有列。上面这句话并不难理解,其充分说明了某张表的扩展表所包含的内容。但是想要彻底理解和掌握,则必须要对上级表这个概念有充分的理解。

  上级表这个概念是随着两张表之间的关系而定义的,而两张表之间的关系有:一对多关系、多对一关系、一对一关系以及多对多关系,共四种。在这四种关系中,位于多端的表称为下级表,位于一端的表称为上级表。因此,对于一对多关系与多对一关系,其上级表与下级表的划分非常清晰,对于一对一关系,则该关系的两张表互为上级表,而对于多对多关系,该关系的两张表互为下级表。

  例如:

  1、A表与B表之间的关系为一对一关系,那么A表与B表互为上级表,因此,B表的扩展表不仅包含了B表的所有列,还包含了A表的所有列。同理,A表的扩展表不仅包含了A表的所有列,还包含了B表的所有列。

  2、A表与B表之间的关系为多对多关系,那么A表与B表互为下级表,因此,B表的扩展表仅包含B表的所有列,同理,A表的扩展表也仅包含A表的所有列。


  下面通过一个例子来介绍ALLCROSSFILTERED函数的具体行为:

  使用到的数据与数据模型如下图所示:

  使用到的度量值表达式如下:

销售数量 = SUM('订单表'[数量])

销售数量-ALL = CALCULATE([销售数量],ALL('订单表'))

销售数量-ALLCROSSFILTERED = CALCULATE([销售数量],ALLCROSSFILTERED('订单表'))

  新建一个矩阵,把产品表中的产品名称放到行字段,并把上面三个度量值放到值字段,结果如下:

  由于产品表是订单表的上级表,所以订单表的扩展表包含了产品表的所有列,又因为ALL函数与ALLCROSSFILTERED函数都会移除参数所指定的表的扩展表上的所有筛选器,因此后两个度量值的结果均为21。

  下面修改一下模型,再来看下上面矩阵中各个度量值的结果,更改后的模型如下:

  更改数据模型后,矩阵的结果变为:

  改变模型关系后,产品表与订单表之间为多对多关系,那么这两张表互为下级表,因此订单表的扩展表不包含产品表的所有列,而ALL函数只移除参数所指定表的扩展表上的筛选器,所以行标签所提供的筛选器没有被移除,因此[销售金额-ALL]这个度量值的结果与[销售金额]度量值的结果一致。而对于ALLCROSSFILTERED函数而言,它除了移除扩展表上的筛选器外,还会移除不基于扩展表来实现筛选行为的相关筛选器,因此行标签所提供的筛选器被移除了,所以[销售金额-ALLCROSSFILTERED]度量值的结果仍为21。


  总的来说,ALLCROSSFILTERED函数的局限性还是很大的,因为它只能用作筛选调节器,而且只接受表作为其参数,灵活性没有那么高,但是其在某些特定情况下还是能发挥出重要作用的。

  相比于ALLCROSSFILTERED函数,ALL函数就显得非常强大了,毕竟在一般情况下的模型大多都是使用一对多关系或者多对一关系,很少使用到多对多关系。而且即使遇到了上面的案列,也可以使用ALL函数直接移除在发挥作用的筛选器,并不一定需要使用ALLCROSSFILTERED函数,但这需要对DAX的原理与各种细节都有比较深的理解才行。因此最好把ALLCROSSFILTERED函数也掌握了,万一用到了呢。


  DAX系列文章中涉及到的案例文件,均已上传到QQ群:344353627,若有需要,可自行加群获取。

  加入Q群