修改筛选器上下文

已完成

可以使用 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 页的表视觉对象。

图像显示具有三个列的表:“区域”、“收入”和“红色收入”。该表显示 10 行和总计。

在下一个示例中,以下度量值按多种颜色对“收入”度量值进行筛选。 请注意,使用 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 函数。

注意

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

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

图像显示具有三个列的表:“区域”、“收入”和“红色收入”。该表显示 10 行和总计。

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

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

图像显示具有三个列的表:“颜色”、“收入”和“红色收入”。该表显示 10 行和总计。每个行的“红色收入”值都相同。

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

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