ALLSELECTED函数

ALLSELECTED函数,被微软划分为“筛选”类函数,隶属于“表函数”。其用途,常常是用来计算或者显示明面上的筛选影响,而忽略其行上下文的影响。

如果说,CALCULATE函数是DAX中最灵活的函数,那么ALLSELECTED函数就是DAX中最复杂,也是最难的函数。作为ALL函数系列家族中的一员,它并不像其他ALL系列函数那样,可以称得上是个性鲜明。

举个例子:

如果说其他ALL系列函数,都有自己的底线,无论面对什么样的筛选都会有一丝坚持的话,那么ALLSELECTED函数就是最容易发生变化的那一个。

其主要用途,也是常见用途有三种:

1、用来计算相对排名;
2、用来计算相对占比;
3、用来保证没有模型关系的维度筛选生效。

语法

DAX=
ALLSELECTED([<表> | <列>[, <列>[, <列>[,…]]]] )

参数

表:(可选项)不能是表达式,现有表的名称。
列:(可选项可重复)不能是表达式,现有列的名称。
注意:要么是表,要么是列;如果是多列,必须在同一表中。返回结果
不带任何列或行上下文的上下文。

这里说一下,行上下文,我们可以理解为原始数据中,一行接着一行的排序,这个叫行上下文,也就是藏在内部的筛选关系,这里称之为隐性筛选。切片器这种,通过一些摆在明面的控制器,来影响计算,筛选的条件,这里称之为显性筛选,即肉眼可见的控制。

例子

模拟数据:

这是白茶随机模拟的一份数据,很简单。

例子1,计算相对排名:

代码1:

ALLSELECTED例子1 =
RANKX ( ALLSELECTED ( '例子' ), CALCULATE ( SUM ( '例子'[数据] ) ) )

代码2:

ALL例子1 =
RANKX ( ALL ( '例子' ), CALCULATE ( SUM ( '例子'[数据] ) ) )

结果:

可以看得出来,无论切片器怎么调整筛选,ALL函数始终遵循隐性筛选控制,排名不变化;而ALLSELECTED函数遵循显性筛选控制,筛选变化,排序的值也跟着变化。

例子2,计算相对占比:

代码1:

ALLSELECTED例子2 =
SUM ( '例子'[数据] ) / CALCULATE ( SUM ( '例子'[数据] ), ALLSELECTED ( '例子' ) )

代码2:

ALL例子2 =
SUM ( '例子'[数据] ) / CALCULATE ( SUM ( '例子'[数据] ), ALL ( '例子' ) )

结果:

依然遵循隐性筛选和显性筛选的原则。无论切片怎么动,ALL函数遵循行上下文的隐性筛选,不受切片器联动。ALLSELECTED函数遵循显性控制,忽略行上下文,占比始终发生变化。

例子3,没有关系维度筛选生效:

维度表 =
DATESBETWEEN ( '例子'[坐标轴], DATE ( 2020, 1, 4 ), DATE ( 2020, 1, 8 ) )

随机生成一个维度表,二者不建立关系。

代码1:

ALLSELECTED例子3 =
CALCULATE (
    SUM ( '例子'[数据] ),
    FILTER ( '例子', '例子'[坐标轴] IN ALLSELECTED ( '维度表'[坐标轴] ) )
)

代码2:

ALLSELECTED例子4 =
CALCULATE (
    SUM ( '例子'[数据] ),
    FILTER ( '例子', '例子'[坐标轴] = ALLSELECTED ( '维度表'[坐标轴] ) )
)

结果:

可以看得出来,当我们新建立一个维度,又不想影响其他筛选的情况下,使用ALLSELECTED函数不失为一种选择,尤其是对于TREATAS函数不了解的情况下。


到这里,关于ALLSELECTED函数的常用例子基本上就介绍完毕了。

可能小伙伴们在其他地方看到了很多关于ALLSELECTED函数影子筛选这一部分的介绍,以及白茶在文初提到的复杂性问题,实际上对于我们日常生活的使用影响并不大。如果不是深度研究DAX的内部运行原理,以及开发者,后续的东西掌握多了,反而会影响我们对此的使用。

当然,如果以后有时间了,或者实际案例用到这了,白茶会说说后续的事情的。

小伙伴们❤GET了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。