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)設置。
參考文檔:
