修改筛选器上下文

已完成

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

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

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

筛选器可以是布尔表达式或表表达式。 修改筛选器上下文时,还可以传入筛选器修改函数,以提供额外的控制。

如果有多个筛选器,则使用 AND 逻辑运算符对它们进行计算,这意味着所有条件必须同时为 TRUE

注意

CALCULATETABLE DAX 函数执行与 CALCULATE 函数完全相同的功能,除非修改了应用于返回表对象的表达式的筛选器上下文。 在此模块中,说明和示例使用 CALCULATE 函数,但请记住,这些方案也适用于 CALCULATETABLE 函数。

应用布尔表达式筛选器

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

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

在本例中,你将创建一个度量值。 首先,下载并打开 Adventure Works DW 2020 M06.pbix 文件。 然后,将以下度量值添加到 Sales 表中,用于通过对红色产品使用布尔表达式筛选器来筛选“收入”度量值。

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

将“红色收入”度量值添加到位于报表第 1 页的表视觉对象。

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

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

以下度量值按成本高昂的产品筛选“收入”度量值。 成本高昂的产品是标价超过 1000 美元的产品。

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

应用表表达式筛选器

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

通常,你将使用 FILTER DAX 函数来应用复杂的筛选条件,其中包括不能由布尔筛选表达式定义的条件。 FILTER 函数归类为迭代器函数,因此,你将传入表或表表达式,以及用于计算该表各行的一个表达式。

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

下面的示例演示使用 FILTER 函数的表筛选表达式:

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

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

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

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

筛选器行为

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

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

下面的示例演示如何将筛选表达式添加到 CALCULATE 函数。

注意

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

与前一个活动一样,“红色收入”度量值已添加到按区域分组并显示收入的表视觉对象。

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

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

“红色收入”度量值公式通过向 Product 表中的 Color 列(红色)添加筛选器来计算“收入”度量值。 因此,在这个按颜色进行分组的视觉对象中,度量值公式使用新筛选器覆盖筛选器上下文。

此结果可能是所需的结果,也可能不是。 下一个单元介绍 KEEPFILTERS DAX 函数,该函数是一个筛选器修改函数,可用于保留筛选器而不是对其进行覆盖。