上下文转换,把当前的行上下文自动转换为等效的筛选上下文。这里我们详细说下,行上下文总是只有一个行,而calculate转换后得出的筛选上下文就可有可能包含多个行了,并且calculate的筛选条件也可能影响多个列,这个依据表结构的不同而定。
如果模型中,对表定义了主键,那么calculate建立的筛选上下文只包含主键,事实上,这样的筛选上下文结果就只有一行,由主键唯一的确认。还有一个点要提示一下,主键的定义方式,不仅可以由表元数据定义,也可以在关系中把表作为目标表而定义。两种方式下,上下文转换只会过滤一个单一的列,因为该列都是唯一值,所以结果就是只有唯一的一行。
如果表没有主键,那么上下文转换生成的筛选条件会作用于所有的列。这个筛选结果根据表结构的不同,可能会包含多个行。这样如果所有的行都是不同的,那么筛选的结果就是唯一行,而如果表格里面由相同的行,那么,这些重复行都会在筛选的结果里面。.
下面的例子中,分别返回正确和错误的结果。
[Sales Amount] := SUMX ( Sales, Sales[Quantity] * Sales[Unit
Price] )
[Wrong Sales] := SUMX ( Sales, [Sales Amount] )
[Correct Sales] := SUMX ( Sales, Sales[Quantity] * Sales[Unit
Price] )
事实上,wrong sales迭代了整个sales表,对于每一行,sales amount计算所有筛选出来的行。而correct sales计算了表中的每一行。作为结果,如果sales有多个行相同,wrong sales会返回的结果会更多。
当我们针对的是维度表的时候,这个不是问题,因为维度表中都有个主键。这情况下,每行都是唯一的行。但是在事实表中,如果表没有主键,那么你要仔细考虑一下,是否有重复的行。否则你可能会返回非预期的值。