DAX 第四篇:CALCULATE詳解


CALCULATE()函數是DAX中最復雜的函數,用於計算由指定過濾器修改的上下文中的表達式。
CALCULATE(<expression>,<filter1>,<filter2>…) 

 第一個參數是用於計算聚合值的度量,后面的參數是可選的過濾器,共有兩種類型:

  • 返回布爾值的邏輯表達式
  • 返回表值的表達式

CALCULATE函數的復雜之處在於可變的計算上下文。如果數據已被過濾,則CALCULATE函數會更改過濾數據的上下文,並在您指定的新上下文中計算表達式。 對於filter參數中使用的每個列,將刪除該列上的任何現有過濾器,並應用filter參數中使用的過濾器。

對於CALCULATE函數過濾上下文來說,filter參數的順序是十分重要的。對於同一列,后面的filter參數會覆蓋前面的filter參數設置的過濾上下文;對於不同列,filter參數指定的過濾上下文是共同作用的。

一,保持過濾器

在DAX中增加過濾器,一種行為是替換相同列上的所有現有的過濾器,使用參數指定的過濾器來計算表達式,也就是說,在移除相同列上原有的過濾器之后,而采用新的過濾器上下文。另外一種行為是不移除當前上下文中原有的過濾器,將當前上下文中的任何現有過濾器與參數中指定的過濾器進行比較,並把這兩種過濾器的交集用作評估表達式的上下文,也就是說,向現有的過濾器上下文中增加新的過濾器,KEEPFILTERS 函數表現的是后一種行為。

KEEPFILTERS(<expression>)  

默認情況下,CALCULATE等函數中的過濾器參數用作評估表達式的上下文,過濾器參數會替換相同列上的所有現有過濾器。CALCULATE等函數的filter參數,只能修改filter參數中提到的列上的上下文。filter參數中沒有提到的列,其過濾器不受任何影響。

KEEPFILTERS函數允許您修改此行為,使用KEEPFILTERS時,將當前上下文中的任何現有過濾器與過濾器參數中的列進行比較,並將這些參數的交集用作評估表達式的上下文。換句話說,當CALCULATE過濾器替換當前上下文時,KEEPFILTERS會將過濾器添加到當前上下文中。

二,計算表表達式

在由給定過濾器修改的上下文中計算表表達式:

CALCULATETABLE(<expression>,<filter1>,<filter2>,…) 

CALCULATETABLE 函數使用filter參數來更改過濾數據的上下文,在指定的新上下文中計算表達式。 對於filter參數中使用的每個列,將刪除該列上的任何現有過濾器,並應用filter參數中使用的過濾器。

例如,下面的公式,計算2016年的銷售總量:

=SUMX( CALCULATETABLE('InternetSales', 'DateTime'[CalendarYear]=2006)  
     , [SalesAmount])  

其中,RELATEDTABLE(<tableName>) 是CALCULATETABLE(<tableName>) 的同義詞。

三,修改關系

DAX在引用關系時,可以在查詢上下文中臨時修改關系的設置,比如引用處於不活躍狀態的關系,修改現有關系的交叉過濾的方向設置。重寫的關系設置只在查詢時有效,不會影響數據模型中的關系設置。

1,引用已有的關系

USERELATIONSHIP使用數據模型中已有的關系,通過關系兩端的字段來指定關系:

USERELATIONSHIP(<columnName1>,<columnName2>) 

在USERELATIONSHIP函數中,關系的狀態是不重要的,但是關系必須事先創建於數據模型中,由於活躍的關系在DAX中是可以直接引用的,因此,該函數實際上用於引用處於不活躍(Inactive)狀態的關系。

=CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date])) 

2,指定交叉過濾的方向

CROSSFILTER 使用數據模型中已有的關系,通過關系兩端的字段來指定關系:

CROSSFILTER(<columnName1>, <columnName2>, <direction>) 

在CROSSFILTER 中,關系的交叉過濾(cross-filtering)的設置是不重要的,也就是說,不論關系在數據模型中設置為single 方向或both方向,都不會影響函數的使用,CROSSFILTER將覆蓋任何現有的交叉過濾(cross-filtering)設置。

 

 

參考文檔:

詳解CALCULATE系列-基礎篇

CALCULATE 庖丁解牛系列-- 擴展表(1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM