按目前我們學(xué)習(xí)的內(nèi)容,我們知道以下兩個(gè)product表的計(jì)算列的區(qū)別:
Product[SumOfUnitPrice] = CALCULATE ( SUM ( Product[Unit
Price] ) )
Product[SumOfAllUnitPrice] = CALCULATE ( SUM ( Product[Unit
Price] ), ALL ( Product ) )
這兩個(gè)都是計(jì)算列,都使用了calculate函數(shù),因此,兩個(gè)都會(huì)發(fā)生上下文轉(zhuǎn)換。
sumofunitprice是只包含當(dāng)前行產(chǎn)品的計(jì)算值,但是,sumofallunitprice呢?直觀看,因?yàn)槭褂昧薬ll(product),你會(huì)期望列中包含了所有的unitprice。的確,結(jié)果是這樣的。但是,如果你仔細(xì)思考下我們之前說(shuō)的規(guī)則,似乎這里又有些問題。
事實(shí)上,all(product)返回了整個(gè)product表,移除了篩選上下文產(chǎn)生的過濾器。但是,同時(shí),上下文的轉(zhuǎn)換會(huì)使得product的篩選條件是只有一個(gè)產(chǎn)品,也就是當(dāng)前行。如果你把兩個(gè)條件用AND連接例來(lái),那么上下文轉(zhuǎn)換的限制更細(xì),所以,結(jié)果就是上下文轉(zhuǎn)換的條件獲勝。但是,為什么結(jié)果卻是全部的產(chǎn)品呢,而不是當(dāng)前的產(chǎn)品。
因?yàn)檫@里對(duì)于上下文轉(zhuǎn)換而產(chǎn)生的篩選上下文,以及由calculate產(chǎn)生的篩選上下文,兩者有先后順序。calculate先執(zhí)行了上下轉(zhuǎn)換,然后才執(zhí)行篩選參數(shù)產(chǎn)生的條件。因此,calculate的條件會(huì)覆蓋由上下文轉(zhuǎn)換而產(chǎn)生的篩選條件。
這個(gè)過程相比于描述,通過使用來(lái)解釋會(huì)更加直觀。事實(shí)上,對(duì)于上面這種情況,只有一種執(zhí)行順序是正確的,對(duì)于結(jié)果,我們要知道為什么,結(jié)果是如何計(jì)算出來(lái)的。最重要的就是:calculate中的篩選條件,會(huì)覆蓋來(lái)自于上下文轉(zhuǎn)換的條件。(換句話說(shuō),就是篩選參數(shù)的條件后執(zhí)行。)