DAX 第四篇:CALCULATE详解

2021年11月24日 阅读数:4
这篇文章主要向大家介绍DAX 第四篇:CALCULATE详解,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式。
CALCULATE(<expression>,<filter1>,<filter2>…)

 第一个参数是用于计算聚合值的度量,后面的参数是可选的过滤器,共有两种类型:express

  • 返回布尔值的逻辑表达式
  • 返回表值的表达式

CALCULATE函数的复杂之处在于可变的计算上下文。若是数据已被过滤,则CALCULATE函数会更改过滤数据的上下文,并在您指定的新上下文中计算表达式。 对于filter参数中使用的每一个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。函数

对于CALCULATE函数过滤上下文来讲,filter参数的顺序是十分重要的。对于同一列,后面的filter参数会覆盖前面的filter参数设置的过滤上下文;对于不一样列,filter参数指定的过滤上下文是共同做用的。url

一,保持过滤器

在DAX中增长过滤器,一种行为是替换相同列上的全部现有的过滤器,使用参数指定的过滤器来计算表达式,也就是说,在移除相同列上原有的过滤器以后,而采用新的过滤器上下文。另一种行为是不移除当前上下文中原有的过滤器,将当前上下文中的任何现有过滤器与参数中指定的过滤器进行比较,并把这两种过滤器的交集用做评估表达式的上下文,也就是说,向现有的过滤器上下文中增长新的过滤器,KEEPFILTERS 函数表现的是后一种行为。spa

KEEPFILTERS(<expression>)

默认状况下,CALCULATE等函数中的过滤器参数用做评估表达式的上下文,过滤器参数会替换相同列上的全部现有过滤器。CALCULATE等函数的filter参数,只能修改filter参数中提到的列上的上下文。filter参数中没有提到的列,其过滤器不受任何影响。.net

KEEPFILTERS函数容许您修改此行为,使用KEEPFILTERS时,将当前上下文中的任何现有过滤器与过滤器参数中的列进行比较,并将这些参数的交集用做评估表达式的上下文。换句话说,当CALCULATE过滤器替换当前上下文时,KEEPFILTERS会将过滤器添加到当前上下文中。code

二,计算表表达式

在由给定过滤器修改的上下文中计算表表达式:blog

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

CALCULATETABLE 函数使用filter参数来更改过滤数据的上下文,在指定的新上下文中计算表达式。 对于filter参数中使用的每一个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。ip

例如,下面的公式,计算2016年的销售总量:文档

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

其中,RELATEDTABLE(<tableName>) 是CALCULATETABLE(<tableName>) 的同义词。get

三,修改关系

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)