上下文的传递性

当DAX表达式内需要对多个表单中的内容进行计算时,需要特别注意上下文的传递性。行上下文关系在表之间不具有自动传播性。例如Bike表和Sales表之间是一对多的关联关系,如果想计算每种产品的销售额,直接使用Sales[Volume]*Bike[Price]进行计算时Power BI会报错,提示无法获取当前Bike列中的Product值,即两个表单虽然有关联关系,但通过行上下文无法从Sales表获取Bike表中对应的信息。此时,必须借助RELATED函数才能将行上下文的过滤条件传递给对应表单,从而获取所需数据进行计算。

上下文的传递性_第1张图片
与行上下文不同,筛选上下文在表之间存在传递关系,在多对一关联关系中,应用在多的一方的筛选条件可以自动传播到一的一方对其进行筛选。例如在下面的表集群当中,Sales表和Bike表是多对一关系,Bike表和Product Category表也是多对一关系,这三张表可以联合成一张虚拟的大表,这个虚拟表中包含三张表中全部的数据列,使得应用到Sales表上的筛选条件,可以传递到Bike表以及Product Category表当中,并且通过应用到Sales表上的一个筛选条件,必定可以在Bike表和Product Category表中筛选出唯一一组符合条件的数据。

上下文的传递性_第2张图片
需要注意的是,如果想利用筛选上下文在多对一关系的表之间具有传递性这一特点,通过对一个表的筛选来过滤另外一个表中的数据,在ALL函数的使用上需要特额外小心。例如下面这两个表达式看似非常相近,但实际上获得的结果完全不同。

All_Column =
CALCULATE (
    COUNTROWS ( 'Product Category' ),
    FILTER (
        ALL ( 'Bike'[Product] ),
        'Bike'[Product] = "Mountain Bike"
    )
)

All_Table =
CALCULATE (
    COUNTROWS ( 'Product Category' ),
    FILTER (
        ALL ( 'Bike' ),
        'Bike'[Product] = "Mountain Bike"
    )
)

上下文的传递性_第3张图片
这两个表达式的区别主要在于,All_Column内使用ALL函数去除了Bike表内Product列上的筛选条件,之后再筛选’Bike’[Product] = "Mountain Bike"的数据,而All_Table则用ALL函数去掉了整个Bike表上的筛选条件,然后再筛选’Bike’[Product] = "Mountain Bike"的数据。

All_Column 表达式计算出错是由于Product列并不存在于Product Category表中,这样导致只针对Product列上的任何过滤筛选都不会对Product Category表产生影响,因此,在All_Column表达式当中,COUNTROWS函数的计算范围让然是整个Product Category表,所以获得的结果是2,而不是1。

你可能感兴趣的:(上下文的传递性)