使用筛选器修饰符函数

已完成

使用 CALCULATE 函数时,您可以传入筛选器修改函数,这允许您完成比单独添加筛选器更多的任务。

移除筛选器

使用 REMOVEFILTERS 函数作为 CALCULATE 筛选表达式,以从筛选器上下文中移除筛选器。 它可以从一个或多个列或从单个表的所有列中删除筛选器。

注意

REMOVEFILTERS 函数相对较新。 在先前版本的 DAX 中,您使用 ALL 函数或变体(包括 ALLEXCEPTALLNOBLANKROW 函数)来移除筛选器。 这些函数同时作为筛选器修饰符和返回不同值的表对象的函数。 之所以现在提到这些函数,是因为您可能会找到使用它们移除筛选器的文档和公式示例。

在以下示例中,您将向 Sales 表添加可计算 Revenue 度量值的新度量值,但会通过从 Sales Territory 表中移除筛选器来实现此目标。 将此度量值的格式设置为带有两个小数位数的货币。

Revenue Total Region = CALCULATE([Revenue], REMOVEFILTERS('Sales Territory'))

现在,将 Revenue Total Region 度量值添加到在报表的第 2 页上找到的矩阵视觉对象。 矩阵视觉对象将按“Sales Territory”表中行上的以下三列进行分组:GroupCountryRegion

矩阵的屏幕截图,其中“Revenue Total Region”列中每行的所有值都相同。

请注意,每个 Revenue Total Region 度量值都相同。 这是总收入的值。

尽管此结果本身并没什么用,但当它作为比率中的分母使用时,它将计算总金额的百分比。 因此,现在将使用以下定义覆盖 Revenue Total Region 度量值定义。 此新定义将更改度量值名称并声明两个变量。 请务必将度量值的格式设置为带有两个小数位数的百分比。

Revenue % Total Region =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalRegionRevenue =
    CALCULATE(
        [Revenue],
        REMOVEFILTERS('Sales Territory')
    )
RETURN
    DIVIDE(
        CurrentRegionRevenue,
        TotalRegionRevenue
    )

验证矩阵视觉对象现在是否显示 Revenue % Total Region 值。

屏幕截图现在显示“Revenue”列以及新“Revenue % Total Region”列中每个区域的唯一值。

现在您将创建另一个度量值,但这次,您将计算区域的收入除以其国家或地区的收入的比率。

在完成此任务之前,请注意,西南地区的 Revenue % Total Region 值为 22.95%。 调查此单元格的筛选器上下文。 切换到数据视图,然后在数据窗格中,选择 Sales Territory 表。

应用以下列筛选器:

  • Group - 北美
  • Country - 美国
  • Region - 西南

屏幕截图显示具有所有三列的筛选器的“数据”窗格,如前所述。

请注意,筛选器会将表减少为仅占一行。 现在,在考虑新目标以创建区域收入占其国家/地区收入的比率时,请从 Region 列中清除筛选器。

屏幕截图显示列上下文菜单,并突出显示“清除筛选器”命令。

请注意,现在有五行,每行都属于“美国”国家/地区。 相应地,当您清除 Region 列筛选器,同时在 CountryGroup 列上保留筛选器时,您将有一个适用于该区域国家/地区的新筛选器上下文。

在下面的度量值定义中,请注意如何清除或移除列中的筛选器。 在 DAX 逻辑中,这是对 Revenue % Total Region 度量值公式所做的细微更改:REMOVEFILTERS 函数现在从 Region 列(而非 Sales Territory 表的所有列)中移除筛选器。

Revenue % Total Country =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalCountryRevenue =
    CALCULATE(
        [Revenue],
        REMOVEFILTERS('Sales Territory'[Region])
    )
RETURN
    DIVIDE(
        CurrentRegionRevenue,
        TotalCountryRevenue
    )

Revenue % Total Country 度量值添加到 Sales 表,然后将其格式设置为带有两个小数位数的百分比。 将新度量值添加到矩阵视觉对象。

屏幕截图显示每个区域的单个值,总计为 100% 的矩阵。

请注意,除美国地区的值外,所有值都是 100%。 这是因为 Adventure Works 公司在美国设有地区,而所有其他国家/地区都没有。

注意

表格模型不支持不规则层次结构,它们是具有可变深度的层次结构。 因此,它是一种用于在层次结构的较低级别重复父(或其他上级)值的常见设计方法。 例如,澳大利亚没有地区,因此国家/地区值将重复作为地区名称。 存储有意义的值总是比空白值更好。

下一个示例是将创建的最后一个度量值。 添加 Revenue % Total Group 度量值,然后将其格式设置为带有两个小数位数的百分比。 然后,将新度量值添加到矩阵视觉对象。

Revenue % Total Group =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalGroupRevenue =
    CALCULATE(
        [Revenue],
        REMOVEFILTERS(
            'Sales Territory'[Region],
            'Sales Territory'[Country]
        )
    )
RETURN
    DIVIDE(
        CurrentRegionRevenue,
        TotalGroupRevenue
    )

屏幕截图现在显示包含“Revenue % Total Group”汇总列的矩阵。

当您从 Sales Territory 表中的 RegionCountry 列中移除筛选器时,该度量值将计算该区域的收入占其所在组收入的比率。

保留筛选器

您可以使用 KEEPFILTERS 函数作为 CALCULATE 函数中的筛选表达式以保留筛选器。

若要观察如何完成此任务,请切换到报表的第 1 页。 然后,修改 Revenue Red 度量值定义以使用 KEEPFILTERS 函数。

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

屏幕截图显示一个包含“Colors”、“Revenue”和“Revenue Red”的表。“Revenue Red”仅返回颜色为红色的结果。

在表视觉对象中,请注意,只存在一个 Revenue Red 度量值。 原因在于,布尔筛选表达式保留 Product 表中 Color 列上的现有筛选器。 红色之外的颜色为空的原因是,这两个筛选器结合使用了筛选器上下文和筛选表达式。 黑色和红色是相交的,因为这两种情况不能同时为 TRUE,所以该表达式的筛选方式不是产品行。 只有两个红色筛选器可以同时为 TRUE,这就解释了显示一个 Revenue Red 度量值的原因。

使用非活动关系

仅当 USERELATIONSHIP 函数作为筛选表达式传递给 CALCULATE 函数时,非活动模型关系才能传播筛选器。 使用此函数参与非活动关系时,活动关系将自动变为非活动状态。

查看使用非活动关系按装运日期计算 Revenue 度量值的度量值定义示例:

Revenue Shipped =
CALCULATE (
    [Revenue],
    USERELATIONSHIP('Date'[DateKey], Sales[ShipDateKey])
)

修改关系行为

通过将 CROSSFILTER 函数作为筛选表达式传递给 CALCULATE 函数,您可以在计算表达式时修改模型关系行为。 这是一个高级功能。

CROSSFILTER 函数可以修改筛选器方向(从两者到单个或从单个到两者),甚至可以禁用关系。