修改筛选器上下文

已完成

您可以使用 CALCULATE 函数在公式中修改筛选器上下文。 CALCULATE 函数的语法如下:

CALCULATE(<expression>, [[<filter1>], <filter2>]…)

函数要求传入一个表达式,该表达式返回标量值和所需数量的筛选器。 表达式可以是度量值(命名表达式)也可以是可在筛选器上下文中计算的任何表达式。

筛选器可以是布尔表达式或表表达式。 此外,还可以传递筛选器修改函数,这些函数可在您修改筛选器上下文时提供更多控制。

当有多个筛选器时,将使用 AND 逻辑运算符进行计算,这意味着所有条件必须同时为 TRUE

注意

CALCULATETABLE 函数执行的功能与 CALCULATE 函数完全相同,不同之处在于它修改了应用于返回表对象的表达式的筛选器上下文。 在本模块中,说明和示例使用 CALCULATE 函数,但请记住,这些应用场景也可能适用于 CALCULATETABLE 函数。

应用布尔表达式筛选器

布尔表达式筛选器是一种计算结果为 TRUEFALSE 的表达式。 布尔筛选器必须遵守以下规则:

  • 它们只能引用单个列。
  • 它们不能引用度量值。
  • 它们不能使用扫描或返回包含聚合函数(例如 SUM)的表的函数。

若要执行本示例中的任务,请下载并打开 Adventure Works DW 2020 M06.pbix 文件。 然后,将以下度量值添加到 Sales 表中,以针对红色产品使用布尔表达式筛选器来筛选 Revenue 度量值。

Revenue Red =
CALCULATE(
    [Revenue],
    'Product'[Color] = "Red"
)

Revenue Red 度量值添加到在报表的第 1 页上找到的表视觉对象。

屏幕截图显示了一个包含三列的表:Region、Revenue 和 Revenue Red。该表显示 10 行和一个总计。

在下一个示例中,以下度量值按多种颜色筛选 Revenue 度量值。 请注意,使用 IN 运算符后跟颜色值列表。

Revenue Red or Blue =
CALCULATE(
    [Revenue],
    'Product'[Color] IN {"Red", "Blue"}
)

以下度量值按昂贵产品筛选 Revenue 度量值。 昂贵产品是指标价高于 1,000 美元的产品。

Revenue Expensive Products =
CALCULATE(
    [Revenue],
    'Product'[List Price] > 1000
)

应用表表达式筛选器

表表达式筛选器将表对象应用为筛选器。 它可以是对模型表的引用;但是,它可能是返回表对象的 DAX 函数。

通常,FILTER 函数用于应用复杂的筛选器条件,包括布尔筛选表达式无法定义的条件。 FILTER 函数归类为迭代程序函数,因此您需要传入表或表表达式以及要针对该表的每一行进行计算的表达式。

FILTER 函数返回的表对象与传入的表对象具有完全相同的结构。 它的行是已传入行的子集,这表示表达式计算结果为 TRUE 的行。

以下示例显示了使用 FILTER 函数的表筛选表达式:

Revenue High Margin Products =
CALCULATE(
    [Revenue],
    FILTER(
        'Product',
        'Product'[List Price] > 'Product'[Standard Cost] * 2
    )
)

在本示例中,FILTER 函数筛选处于筛选器上下文中的 Product 表的所有行。 其标价超出其标准成本两倍的产品的每一行都显示为筛选表的一行。 因此,Revenue 度量值将针对 FILTER 函数返回的所有产品进行计算。

传入到 CALCULATE 函数的所有筛选表达式均为表筛选表达式。 布尔筛选表达式是一种简化表示法,用于改进写入和读取体验。 在内部,Microsoft Power BI 将布尔筛选表达式转换为表筛选表达式,这就是它转换 Revenue Red 度量值定义的方式。

Revenue Red =
CALCULATE(
    [Revenue],
    FILTER(
        'Product',
        'Product'[Color] = "Red"
    )
)

筛选器行为

CALCULATE 函数添加筛选表达式时,会出现两种可能的标准结果:

  • 如果列(或表)不在筛选器上下文中,则会向筛选器上下文添加新的筛选器来计算 CALCULATE 表达式。
  • 如果列(或表)已在筛选器上下文中,新筛选器将覆盖现有筛选器以计算 CALCULATE 表达式。

以下示例显示将筛选表达式添加到 CALCULATE 函数的工作原理。

注意

在每个示例中,没有对表视觉对象应用任何筛选器。

与上一个活动一样,Revenue Red 度量值已添加到按区域分组并显示收入的表视觉对象中。

屏幕截图显示了一个包含三列的表:Region、Revenue 和 Revenue Red。该表显示 10 行和一个总计。

由于未对 Product 表中的 Color 列应用筛选器,因此度量值计算会向筛选器上下文添加新的筛选器。 在第一行中,2,681,324.79 美元值对应在澳大利亚地区售出的红色产品。

将表视觉对象的第一列从 Region 切换到 Color 会产生不同的结果,因为 Product 表中的 Color 列现在处于筛选器上下文中。

屏幕截图显示了一个包含三列的表:Color、Revenue 和 Revenue Red。该表显示 10 行和一个总计。每行的 Revenue Red 值都相同。

通过在 Product 表中的 Color 列(变为红色)上添加筛选器,Revenue Red 度量值公式将计算 Revenue 度量值。 在按颜色分组的此视觉对象中,度量值公式会用新的筛选器覆盖筛选器上下文。

此结果可能是所需的结果,也可能不是。 下一单元将介绍 KEEPFILTERS 函数,这是一个筛选器修改函数,可用于保留而非覆盖筛选器。