ALLSELECTED 函数有两种用法:作为表函数,作为CALCULATE函数的筛选调节器,它也是DAX中唯一一个使用影子筛选上下文的函数。
使用影子筛选上下来定义ALLSELECTED 函数的功能:
- 当作为表值函数使用时,ALLSELECTED 函数返回的是最后一个影子筛选上下文中的可见值
- 当作为CALCULATE函数的筛选调节器使用时,ALLSELECTED 函数将还原其参数上的最后一个影子筛选上下文。
在影子筛选上下文中,ALLSELECTED函数执行的操作是:
- 如果ALLSELECTED函数有参数,那么恢复作为参数的列或表上的最后一个影子筛选上下文。
- 如果ALLSELECTED函数没有参数,那么恢复所有列上的最后一个影子筛选上下文。
一,ALLSELECTED 函数
从Microsoft Doc上知道,ALLSELECTED 函数的作用是:从当前的查询中,删除列和行中的上下文过滤器,同时保留所有其他上下文过滤器或显式过滤器,此功能可用于获取基于Visual的总计:
ALLSELECTED([<tableName> | <columnName>[, <columnName>[, <columnName>[,…]]]] )
该函数的返回值是移除了行和列的筛选上下文。对于参数而言,如果有多个<columnName>参数,那么这些列都必须源自同一个表。
ALLSELECTED 函数看起来非常简单,实际上隐藏了一个陷阱,这就是:恢复最后一个影子筛选上下文。
二,影子筛选上下文
关于影子筛选上下文的三个条件:
- 影子筛选上下文存在于迭代函数中,如果没有迭代函数,那么就没有影子筛选上下文,ALLSELECTED函数也就不会执行任何操作。
- 如果在ALLSELECTED函数执行前存在多个迭代函数,那么ALLSELECTED函数会恢复最后一个影子筛选上下。
- 如果传递给ALLSELECTED函数的列没有被影子筛选上下文筛选,那么ALLSELECTED函数就不会执行任何操作。
影子筛选上下文类似于筛选上下文,但是它保持休眠状态,且只能被ALLSELECTED函数激活。休眠状态的影子筛选上下文不会以任何方式影响计算,只有被ALLSELECTED函数激活后,才会影响计算。为了区分影子筛选上下文,把普通的筛选上下文称为显式筛选上下文。
举个例子1,下面DAX返回一个表值函数,Pct是DAX开发工程师编写的代码,变量 FilteredBrands 和 CALCULATETABLE等价于Power BI 的DAX引擎返回的查询语句,这个查询语句的执行过程主要分为4步:
Pct = DIVIDE([Sales Amount],
CALCULATE([Sales Amount], ALLSELECTED(Product[Brand]) )
)
var FilteredBrands = FILTER(ALL(Product[Brand]), Product[Brand] in {
'B1','B2','B3','B4','B5','B6'})
return CALCULATETABLE(
ADDCOLUMNS(