DAX从入门到精通 4-5-2 筛选上下文和关系

我们已经学了,行上下文不会随着关系传播,如果你要使用关系链条,那么你就有两个函数可以使用,这取决于你在关系的哪一方。
筛选上下文,以另外一种方式运行。它可以自动的通过关系传递,并且根据你如何设置关系的筛选决定。总的一句话就是,筛选上下文会沿着关系的方向自由传递。
通过定义一些度量值,然后建立一个透视表来理解这个问题。

[NumOfSales] := COUNTROWS ( Sales )
[NumOfProducts] := COUNTROWS ( Product )
[NumOfCustomers] := COUNTROWS ( Customer )
image.png

筛选条件是产品的颜色product color。product表在sales表的一方,所以筛选上下文会从product传递到sales表。你可以看到NumOfSales针对各个颜色产品计算了销售量。NumOfProduct展示了每种颜色的产品数量,和你想的一样,每行都是各自颜色的对应值,因为这个的筛选上下文就是在product表。
另一方面,NumOfCustomers,用来计算客户数量的。总是显示了相同的值,即所有客户的数量。这是因为customers和sales表之间的关系,看下图:


image.png

筛选器开始于Product,然后传递到sales表,然后它试图继续传递到Customers,但是,关系的方向阻止了继续的传播。单向的关系,只允许筛选器沿着一个方向传播,而不能双向。
你可以把关系的箭头方向理解成红绿灯,如果它们允许,绿灯亮,然后可以通过关系传递。如果不允许,即关系的箭头方向不对,那么就红灯亮,不能通过关系传递。
关系的箭头指示了筛选器流向的方向,总是从一方流向多方。也有选项是你可以从多方访问一方,如果你使箭头失效,那么多到一的功能会失效。
通过下面这个例子,你可以更好的理解关系的这个特征。这次我们不使用color,而是使用customer表的education。


image.png

这次,筛选器开始于Customer表,它可以到达Sales表,因为箭头的方向允许通过关系传递过来。然后,从sales表,它会进一步传递到product表,因为sales表和Product表是双向的。
现在你添加一个类似的度量值用于计算subcategories的数量,如下图:
NumOfSubcategories := COUNTROWS ( 'Product Subcategory' )

添加到报表之后,我们可以看到subcategories并没有被education过滤条件影响。如下图:


image.png

这是因为product和product subcategory的关系是单向的。也就是关系的传播是单向的。只要你把箭头的方向设置为product到product subcategory,那么你就可以单到过滤条件传递过去了。


image.png

就像行上下文一样,无论需要跳过多少关系的表,只要它们的关系允许,筛选条件都会自动传播下午。例如,如果你添加一个过滤条件在product category ,那么过滤条件就会传递到product subcategory,然后到product,最后到达sales表。
很重要的一点是,没有任何一个函数可以通过筛选上下文在表中获取列或者值,因为筛选上下文在DAX表达式中的传递是自动的,但是行上下文不一样,它需要使用特定的函数related和relatedtable。

你可能感兴趣的:(DAX从入门到精通 4-5-2 筛选上下文和关系)