ALLSELECTED函数,经常用但是也比较复杂。说复杂,大概也是因为没有理解清楚。时常在这个函数上感到迷茫。
从简单到复杂。不过也只是关于ALLSELECTED的基础使用。嵌套嵌套的那种,在特殊的解决方案里面再说。这里只有基础使用。基本上够的。
单一的一张表里的分析
没有外部Slicer和filter page的显性filter。
创建measures,定义如下:
SalesQuantity = SUM(Sales[Quantity])
展示结果如下:
创建ALLSELECTED应用下的计算值。
因为ALLSELECTED函数里面的参数是谁,就是对谁忽略,即不考虑这个字段的分类。所以如果想选择不考虑Color的计算,定义如下:
Quantity_Brand = CALCULATE(Sales[SalesQuantity],ALLSELECTED('Product'[Color]) )
结果如下:
所以当你应用ALLSELETED计算Quantity的时候,Power BI会先根据拉出来的Brand和Color创建好框架,然后再计算数据值。
其中因为我们指定了ALLSELECTED要忽视Color,所以得到的就是一个Brand下的所有Color的和。如果在这个表里加入其他的列,新建的Quantity_Brand都会发生变化。ta只特定歧视Color一个字段。你也可以在ALLSELECTED里面加入多个字段,也就是忽视多个字段。
特别写了字段Column_A作为ALLSELECTED参数的情况下,Power BI会先根据你拖拉出来的字段建立好上下文结构(就是行和列形成的特定组合)。如果你的行列里包含Column_A,那么你的计算字段就会选择性忽视这个Column_A里面的内容。这个就是官方文档里面写的
Removes context filters from columns and rows(去掉了Column_A) in the current query, while(但同时) retaining(保留了) all other (其他的)context filters or explicit filters.(Explicit filters显性的筛选也是保留的)
加入切片器Slicer的筛选之后
我们拖拖拉拉的切片器和数据表。显示的数据表还是行列组合成的结构。根据选择的不同的切片器数据内容,展示不同的行列组合结果。
如果是需要被歧视的字段。直接在上面结果的基础上拉一个Slicer,如下图:
我选了Gold,得到的是不同Brand下面的Gold的不同值。
如果我选了Gold和Grey。得到结果如下:
得到的结果是不同Brand下的所有Color的和。所以,总结下:
Power BI会先根据切片器Slicer和行列这些上下文来得到展示的框架 ,然后再计算这个框架下的Quantity的值。计算值的时候,考虑忽视Color。
NB!ALLSELECTED是在当前展示框架下的计算。
以上都是ALLSELECTED里面包含参数的,多个参数和一个参数的理解方式一样。就是你想忽视几个字段的问题。
因为ALLSELECTED里面的参数是可以不写的。建立一个无视所有的参数。
Quantity_ALLSelected = CALCULATE([SalesQuantity],ALLSELECTED())
得到结果如下:
果然是在架构结果的基础上忽视了所有。和之前的理解完全一致。加Slicer也和之前的理解是一致的。
那如果,ALLSELECTED里面的参数是一张表呢?还是和之前的理解一样的。没有什么特别之处。
不过,如果也在报表中展示出来,你就会发现,对于ALLSELECTED为空的情况下,两张原本有关系的表,展示出来字段之间是Cross Join的结果。即每一个Brand都有一个Category,但是,通过观察SalesQuantity,你可以看到,其实只有部分Brand才有相应的Category,但是因为Quantity_ALLSelected这个表达式里面ALLSELECTED(),这里选出的两个Brand包含了所有的Category。这里的计算还是很简单的。
忽视特定的,保留其他的。就是级别不同。
从ALLSELECTED()>ALLSELECTED('table')>ALLSELECTED('table'[column])
还有一些ALLSELECTED的复杂用法,但是也基本可以从这些基础来思考,毕竟我们是源于官方文档的理解的。
如果以后遇到嵌套的上层表函数有ALL或者VALUES(也可能是其他的,我只是把常用的两个提下),注意最临近ALLSELECTED这个函数应用的表达式。
想清楚了再做就很简单了。
谢谢阅读。关注转发吖~~