CALCULATE(, , …)
第一个参数是用于计算聚合值的度量,后面的参数是可选的过滤器,共有两种类型:
- 返回布尔值的逻辑表达式
- 返回表值的表达式
CALCULATE函数的复杂之处在于可变的计算上下文。如果数据已被过滤,则CALCULATE函数会更改过滤数据的上下文,并在您指定的新上下文中计算表达式。 对于filter参数中使用的每个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。
对于CALCULATE函数过滤上下文来说,filter参数的顺序是十分重要的。对于同一列,后面的filter参数会覆盖前面的filter参数设置的过滤上下文;对于不同列,filter参数指定的过滤上下文是共同作用的。
一,保持过滤器
在DAX中增加过滤器,一种行为是替换相同列上的所有现有的过滤器,使用参数指定的过滤器来计算表达式,也就是说,在移除相同列上原有的过滤器之后,而采用新的过滤器上下文。另外一种行为是不移除当前上下文中原有的过滤器,将当前上下文中的任何现有过滤器与参数中指定的过滤器进行比较,并把这两种过滤器的交集用作评估表达式的上下文,也就是说,向现有的过滤器上下文中增加新的过滤器,KEEPFILTERS 函数表现的是后一种行为。
KEEPFILTERS()
默认情况下,CALCULATE等函数中的过滤器参数用作评估表达式的上下文,过滤器参数会替换相同列上的所有现有过滤器。CALCULATE等函数的filter参数,只能修改filter参数中提到的列上的上下文。filter参数中没有提到的列,其过滤器不受任何影响。
KEEPFILTERS函数允许您修改此行为,使用KEEPFILTERS时,将当前上下文中的任何现有过滤器与过滤器参数中的列进行比较,并将这些参数的交集用作评估表达式的上下文。换句话说,当CALCULATE过滤器替换当前上下文时,KEEPFILTERS会将过滤器添加到当前上下文中。
二,计算表表达式
在由给定过滤器修改的上下文中计算表表达式:
CALCULATETABLE(, , ,…)
CALCULATETABLE 函数使用filter参数来更改过滤数据的上下文,在指定的新上下文中计算表达式。 对于filter参数中使用的每个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。
例如,下面的公式,计算2016年的销售总量:
=SUMX( CALCULATETABLE('InternetSales', 'DateTime'[CalendarYear]=2006) , [SalesAmount])
其中,RELATEDTABLE(
三,修改关系
DAX在引用关系时,可以在查询上下文中临时修改关系的设置,比如引用处于不活跃状态的关系,修改现有关系的交叉过滤的方向设置。重写的关系设置只在查询时有效,不会影响数据模型中的关系设置。
1,引用已有的关系
USERELATIONSHIP使用数据模型中已有的关系,通过关系两端的字段来指定关系:
USERELATIONSHIP(, )
在USERELATIONSHIP函数中,关系的状态是不重要的,但是关系必须事先创建于数据模型中,由于活跃的关系在DAX中是可以直接引用的,因此,该函数实际上用于引用处于不活跃(Inactive)状态的关系。
=CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date]))
2,指定交叉过滤的方向
CROSSFILTER 使用数据模型中已有的关系,通过关系两端的字段来指定关系:
CROSSFILTER(, , )
在CROSSFILTER 中,关系的交叉过滤(cross-filtering)的设置是不重要的,也就是说,不论关系在数据模型中设置为single 方向或both方向,都不会影响函数的使用,CROSSFILTER将覆盖任何现有的交叉过滤(cross-filtering)设置。
参考文档:
详解CALCULATE系列-基础篇
CALCULATE 庖丁解牛系列-- 扩展表(1)