在筛选器参数修改过的上下文中计算返回表的表达式。
语法
CALCULATETABLE( <表表达式>, [ <筛选器 1> ], [ <筛选器 2> ] … )
参数 | 属性 | 描述 |
表表达式 | 要计值的返回表的表达式 | |
筛选器参数 | 可选 | 定义筛选器的布尔表达式或返回表的表达式,也可以是 ALL 等调节器函数 |
第一参数
CALCULATETABLE 第一参数使用返回表的表达式(简称表表达式),CALCULATETABLE 的用途是修改第一参数的计值环境,使其在修改后的环境中重新计算,所以第一参数不可省略。
CALCULATETABLE(FILTER(Sales,Sales[Quantity]>1)) //第一参数使用返回表的表达式 CALCULATETABLE(Sales) //第一参数使用表
上面两种写法都未添加筛选器参数,看起来似乎没有改变第一参数的计值环境,在大多数情况下确实如此。但如果将它们应用于存在行上下文的环境中,比如计算列,由于 CALCULATETABLE 的行上下文转换作用,会使得第一参数被转换后的筛选上下文影响。
筛选器参数
CALCULATETABLE 的筛选器参数共有三种:
- 布尔表达式,引用单列且计算结果为 TRUE 或 FALSE 的表达式
- 返回表的表达式,简称表表达式
- 调节器函数,比如 ALL、REMOVEFILTERS、USERELATIONSHIP、KEEPFILTERS 等
布尔表达式
布尔表达式是计算结果为 TRUE 或 FALSE 的表达式,当筛选器参数使用布尔表达式的时候,需要遵循下面的通用规则:
- 只能引用单个表中的列。
- 不能引用度量值。
- 它们不能使用嵌套的 CALCULATETABLE 函数
---- 筛选器参数示意 ---- CALCULATETABLE ( <table expression>, table[column] = 10 //布尔表达式 ) ---- 等价于 ---- CALCULATETABLE ( <table expression>, FILTER ( //返回表的表达式,简称表表达式 ALL ( table[column] ), table[column] = 10 ) )
对于不同的软件(Excel 和 Power BI Desktop),布尔表达式的某些行为略有不同,对于 2021 年 9 月之后的 Power BI Desktop,布尔表达式可以
- 使用返回标量值的聚合函数,聚合函数的参数中可以使用表函数
EVALUATE CALCULATETABLE ( 'Sales', 'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] ) //使用聚合函数 MAX 作为布尔表达式的参数 ) EVALUATE CALCULATETABLE ( 'Sales', 'Sales'[OrderDateKey] = MAXX ('Sales', 'Sales'[OrderDateKey] ) //使用表函数作为聚合函数的参数 )
对于 Excel PowerPivot,布尔表达式的限制要多一些,等号的一侧只能使用标量值,或计算标量值的函数(比如 Date);不能使用扫描表或返回表的任何函数,包括聚合函数。
多个布尔表达式在模型中默认取交集,也可以使用 AND (&&)来连接这些筛选器,这意味着所有被连接的条件都必须为 TRUE,或使用 OR (||) 逻辑运算符来连接,这意味着只要一个条件为 TRUE 整个表达式就返回 TRUE.
EVALUATE CALCULATETABLE ( 'Product', 'Product'[Color] = "Red" || 'Product'[Color] = "Blue" ) ------ 等价于 ----- EVALUATE CALCULATETABLE ( 'Product', 'Product'[Color] IN { "Red", "Blue" } )
返回表的表达式
返回表的表达式简称为表表达式,这类筛选器参数将返回的表作为筛选器应用到模型。 它可以是对模型表的直接引用,但更常见的是返回表的函数。 比如使用 FILTER 函数应用复杂的筛选条件,包括不能由布尔表达式定义的条件。
下面的度量值在 FILTER 中引用了两个列,在 Excel 中你无法使用布尔表达式简写下面的例子,但是 Power BI Desktop 可以(使用 2021 年 3 月之后的版本)
EVALUATE CALCULATETABLE ( 'Sales', FILTER ( Product, Product[Unit Price] >= Product[Unit Cost] * 2 //引用多列的复杂筛选条件 ) )
CALCULATETABLE 调节器
调节器函数不添加新的筛选器,而是通过删除、恢复已有筛选器,或改变筛选行为语义的方式为上下文提供额外的控制手段。
函数 | 用途 |
---|---|
REMOVEFILTERS | 删除所有筛选器,删除表的一列或多列中的筛选器,或者删除单个表的所有列中的筛选器。 |
ALL1、ALLEXCEPT、ALLNOBLANKROW | 删除一列或多列中的筛选器,或者删除单个表的所有列中的筛选器。 |
KEEPFILTERS | 使作为参数的筛选器不删除相同列上的现有筛选器,而是求交集 |
USERELATIONSHIP | 在相关列之间建立非活动关系,此时活动关系将自动变为非活动状态。 |
CROSSFILTER | 修改筛选器方向(从双向到单向,或从单向到双向)或禁用关系。 |
示例用法
EVALUATE CALCULATETABLE ( [Sales Amount], 'Product'[Category] = "Audio", KEEPFILTERS ( 'Product'[Color] IN { "Red", "Blue" } ), //调节器 USERELATIONSHIP ( Sales[Delivery Date], 'Date'[Date] ) //调节器 )
返回值
表
一个完整的表或者具有一列或多列的表。
该表是表达式在修改后的筛选上下文环境中计算的结果。
备注
每个筛选器参数都可以删除筛选器(如 ALL、ALLEXCEPT、ALLNOBLANKROW)、还原筛选器(ALLSELECTED),或者使用一个表表达式,返回一列,多列或整个扩展表的值列表。
当筛选器参数是单列形式的条件判断表达式时,该表达式被嵌入到一个筛选引用列所有值的 FILTER 表达式中。例如本文使用的第二个代码块,筛选器参数示意中的第一个表达式的高亮部分在内部被转换为第二个表达式的高亮部分,两种形式完全等价。所以,除了 CALCULATETABLE 调节器之外,其他形式的筛选器参数的本质都是表。
筛选器参数会覆盖同一列上已有的任何筛选器,你可以使用 KEEPFILTERS 改变这种默认行为。
CALCULATETABLE 和 CALCULATE 的行为相同,也是 DAX 中最重要的函数之一,你可以通过介绍 CALCULATE 的相关文章深入了解这个函数:
- MSDN 文档:CALCULATETABLE
- DAX Guide:CALCULATETABLE
说点什么