CALCULATE
计算修改后的 filter 上下文中的表达式。
注意
还有 CALCULATETABLE 函数。 它执行的功能完全相同,
语法
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
参数
术语 | 定义 |
---|---|
expression |
要计算的表达式。 |
filter1, filter2,… |
(可选)布尔表达式 or 定义 filtersorfilter 修饰符函数的表表达式。 |
用作 first 参数的表达式实质上与 measure相同。
Filters 可以是:
- 布尔 filter 表达式
- 表 filter 表达式
- Filter 修改函数
当有多个 filters时,可以使用 AND(&&
)逻辑运算符来计算它们,这意味着 all 条件必须 TRUE
,or(OR)逻辑运算符 ||
,这意味着任一条件都可以 true。
布尔 filter 表达式
布尔表达式 filter 是计算结果为 TRUE
orFALSE
的表达式。 有几个规则必须遵守:
- 它们可以引用单个表中的列。
- 它们不能引用度量值。
- 它们不能使用嵌套 CALCULATE 函数。
从 2021 年 9 月发布的 Power BI Desktop 开始,以下各项也适用:
- 除非将表作为参数传递给聚合函数,否则它们不能使用扫描 or 返回表的函数。
- 它们 可以 包含返回标量 value的聚合函数。 例如
Total sales on the last selected date = CALCULATE ( SUM ( Sales[Sales Amount] ), 'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] ) )
表 filter 表达式
表表达式 filter 将表对象作为 filter应用。 它可以是对模型表的引用,但更有可能是返回表对象的函数。 可以使用 FILTER 函数应用复杂的 filter 条件,包括布尔 filter 表达式无法定义的条件。
Filter 修饰符函数
Filter 修饰符函数允许你执行更多操作,而不仅仅是添加 filters。 它们提供修改 filter 上下文时的附加控件。
功能 | 目的 |
---|---|
REMOVEFILTERS | 从表的一 all 列中删除 filtersor,filtersor 从单个表的 or 列中 all。 |
ALL 1、ALLEXCEPT、ALLNOBLANKROW | 从一个 filters 更多列中删除 or,从单个表的 or 列中删除 all。 |
KEEPFILTERS | 添加 filter 而不删除相同列上的现有 filters。 |
USERELATIONSHIP | 在 related 列之间参与非活动关系,在这种情况下,活动关系将自动变为非活动状态。 |
CROSSFILTER | 修改 filter 方向(从两者到单个方向,or 从单向两者)or 禁用关系。 |
1ALL 函数 and 其变体的行为既 filter 修饰符 and 返回表对象的函数。 If 工具支持 REMOVEFILTERS 函数,最好使用它删除 filters。
返回 value
是表达式结果的 value。
言论
提供 filter 表达式时,CALCULATE 函数将 filter 上下文修改为 evaluate 表达式。 对于每个 filter 表达式,当 filter 表达式 not 包装在 KEEPFILTERS 函数中时,有两个可能的标准结果:
- If 列(or 表)不在 filter 上下文中,则新 filters 将添加到 filter 上下文中以 evaluate 表达式。
- If 列(or 表)已位于 filter 上下文中,新 filters 将被新的 filters 覆盖以 evaluateCALCULATE 表达式。
在没有
的情况下使用 的 函数可以实现特定的要求。 它将行上下文转换为 filter 上下文。 在计算行上下文中需要计算模型数据的表达式(not 模型 measure),这是必需的。 计算迭代器函数中的表达式时,此方案可能发生在计算列公式中 or。 请注意,当模型 measure 用于行上下文时,上下文转换是自动的。 在计算列 not 行级别安全性 (RLS) 规则中使用时,or 支持在 DirectQuery 模式下使用此函数。
例子
以下 Sales 表 measure 定义会产生收入结果,但仅适用于颜色为蓝色的产品。
本文中的示例可用于 sample Adventure Works DW 2020 Power BI Desktop 模型。 若要获取模型,请参阅 DAXsample 模型。
Blue Revenue =
CALCULATE(
SUM(Sales[Sales Amount]),
'Product'[Color] = "Blue"
)
类别 | 销售金额 | 蓝色收入 |
---|---|---|
辅料 | $1,272,057.89 | $165,406.62 |
自行车 | $94,620,526.21 | $8,374,313.88 |
服装 | $2,117,613.45 | $259,488.37 |
组件 | $11,799,076.66 | $803,642.10 |
总计 | $109,809,274.20 | $9,602,850.97 |
CALCULATE 函数在修改后的 sum 上下文中计算 Sales 表 Sales Amount 列的 filter。 新的 filter 将添加到 Product 表 颜色 列(or),filter 覆盖已应用于列的任何 filter。
以下 Sales 表 measure 定义生成 all 销售渠道销售额的比率。
渠道 | 销售金额 | 总频道收入 % |
---|---|---|
互联网 | $29,358,677.22 | 26.74% |
经销商 | $80,450,596.98 | 73.26% |
总计 | $109,809,274.20 | 100.00% |
Revenue % Total Channel =
DIVIDE(
SUM(Sales[Sales Amount]),
CALCULATE(
SUM(Sales[Sales Amount]),
REMOVEFILTERS('Sales Order'[Channel])
)
)
DIVIDE 函数将 Sales 表的总和 Sales Amount 列 value(在 filter 上下文中)除以修改后的 filter 上下文中的同一表达式。 它是使用 CALCULATE 函数(filter 修饰符函数)修改 REMOVEFILTERS 上下文的 filter 函数。 它从 filters 表 频道 列中删除 。
以下 Customer 表计算列定义将客户分类为会员类。 这是一个非常简单的方案:当客户产生的收入小于 2500 美元时,它们被归类为 低;否则,它们 高。
Customer Segment =
IF(
CALCULATE(SUM(Sales[Sales Amount]), ALLEXCEPT(Customer, Customer[CustomerKey])) < 2500,
"Low",
"High"
)
在此示例中,行上下文转换为 filter 上下文。 它被称为 上下文转换。 ALLEXCEPT 函数从 filtersall 表列中删除 ,exceptCustomerKey 列。