使用筛选器修饰符函数

已完成

使用 CALCULATE 函数时,可以传入筛选器修改函数,这允许你完成除添加筛选器以外的更多操作。

删除筛选器

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

备注

REMOVEFILTERS 函数相对较新。 在早期版本的 DAX 中,你使用 ALL DAX 函数或变量(包括 ALLEXCEPTALLNOBLANKROW DAX 函数)删除了筛选器。 这些函数同时作为筛选器修饰符和返回非重复值的表对象的函数。 之所以提到这些函数,是因为你可能会找到使用它们删除筛选器的文档和公式示例。

在下面的示例中,你将向 Sales 表添加一个新的度量值,该度量值计算“收入”度量值,但通过从“Sales Territory”表中删除筛选器来执行此操作。 将此度量值的格式设置为带有两个小数位数的货币。

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

现在,将“收入占总区域收入的百分比”度量值添加到报表第 2 页中的矩阵视觉对象。 矩阵视觉对象将按行上的“销售区域”表中的三个列进行分组:“组”、“国家/地区”和“区域”。

图中显示了一个标题为“经销商收入”的矩阵,它包含行组“组”、“国家/地区”和“区域”,以及“收入”和“收入占总区域收入的百分比”汇总。对于每个行组,“收入占总区域收入的百分比”的值都相同。

请注意,每个“收入占总区域收入的百分比”值都相同。 这是总收入的值。

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

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

验证矩阵视觉对象是否显示“收入占总区域收入的百分比”值。

图中显示了一个标题为“经销商收入”的矩阵视觉对象,它包含行组“组”、“国家/地区”和“区域”,以及“收入”和“收入占总区域收入的百分比”汇总。

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

在完成此任务之前,请注意,西南地区的“收入占总区域收入的百分比”值为 22.95%。 调查此单元格的筛选器上下文。 切换到数据视图,然后在“字段”窗格中,选择“Sales Territory”表。

应用以下列筛选器:

  • 组 - 北美
  • 国家/地区 - 美国
  • 区域 -西南

图像显示“销售区域”表的 Power BI Desktop 表筛选器。筛选器应用于 (1) 组 = 北美,(2) 国家/地区 = 美国,(3) 区域 = 西南。

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

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

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

在下面的度量值定义中,请注意如何清除或删除列中的筛选器。 在 DAX 逻辑中,这是对“收入占总区域收入的百分比”度量值公式的细微更改:现在,REMOVEFILTERS 函数将从 Region 列中删除筛选器,而不是从“Sales Territory”表的所有列中删除筛选器。

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

向 Sales 表添加“收入占总国家/地区收入的百分比”度量值,然后将其设置为带有两个小数位数的百分比。 将新度量值添加到矩阵视觉对象。

图中显示了一个标题为“经销商收入”的矩阵视觉对象,它包含行组“组”、“国家/地区”和“区域”,以及“收入”、“收入占总区域收入的百分比”,以及“收入占总国家/地区收入的百分比”汇总。仅美国的“收入占总国家/地区收入的百分比”值不是 100%。

请注意,除美国地区的值外,所有值都是 100%。 原因在于,在 Adventure Works 公司,美国具有区域,而所有其他国家/地区则没有。

备注

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

下一个示例是将创建的最后一个度量值。 添加“收入占总组收入的百分比”度量值,然后将其设置为带有两个小数位数的百分比。 然后,将新度量值添加到矩阵视觉对象。

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

图中显示了一个标题为“经销商收入”的矩阵视觉对象,它包含行组“组”、“国家/地区”和“区域”,以及“收入”、“收入占总区域收入的百分比”、“收入占总国家/地区收入的百分比”以及“收入占总组收入的百分比”汇总。

当你从“Sales Territory”表中的 Region 和 Country 列中删除筛选器时,该度量值将计算该区域的收入与其所在组的收入之比。

保留筛选器

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

若要观察如何完成此任务,请切换到报表第 1 页。 然后,将“红色收入”度量值定义修改为使用 KEEPFILTERS 函数。

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

图像显示具有三个列的表视觉对象:“颜色”、“收入”和“红色收入”。显示九行和总计。对于“红色收入”,只有“红色”行和“总计”不为空。

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

使用非活动关系

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

查看使用非活动关系按发货日期计算“收入”度量值的度量值定义示例:

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

修改关系行为

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

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