按目前我们学习的内容,我们知道以下两个product表的计算列的区别:
Product[SumOfUnitPrice] = CALCULATE ( SUM ( Product[Unit
Price] ) )
Product[SumOfAllUnitPrice] = CALCULATE ( SUM ( Product[Unit
Price] ), ALL ( Product ) )
这两个都是计算列,都使用了calculate函数,因此,两个都会发生上下文转换。
sumofunitprice是只包含当前行产品的计算值,但是,sumofallunitprice呢?直观看,因为使用了all(product),你会期望列中包含了所有的unitprice。的确,结果是这样的。但是,如果你仔细思考下我们之前说的规则,似乎这里又有些问题。
事实上,all(product)返回了整个product表,移除了筛选上下文产生的过滤器。但是,同时,上下文的转换会使得product的筛选条件是只有一个产品,也就是当前行。如果你把两个条件用AND连接例来,那么上下文转换的限制更细,所以,结果就是上下文转换的条件获胜。但是,为什么结果却是全部的产品呢,而不是当前的产品。
因为这里对于上下文转换而产生的筛选上下文,以及由calculate产生的筛选上下文,两者有先后顺序。calculate先执行了上下转换,然后才执行筛选参数产生的条件。因此,calculate的条件会覆盖由上下文转换而产生的筛选条件。
这个过程相比于描述,通过使用来解释会更加直观。事实上,对于上面这种情况,只有一种执行顺序是正确的,对于结果,我们要知道为什么,结果是如何计算出来的。最重要的就是:calculate中的筛选条件,会覆盖来自于上下文转换的条件。(换句话说,就是筛选参数的条件后执行。)
网友评论