使用筛选器修饰符函数
使用 CALCULATE 函数时,您可以传入筛选器修改函数,这允许您完成比单独添加筛选器更多的任务。
移除筛选器
使用 REMOVEFILTERS 函数作为 CALCULATE 筛选表达式,以从筛选器上下文中移除筛选器。 它可以从一个或多个列或从单个表的所有列中删除筛选器。
注意
              REMOVEFILTERS 函数相对较新。 在先前版本的 DAX 中,您使用 ALL 函数或变体(包括 ALLEXCEPT 和 ALLNOBLANKROW 函数)来移除筛选器。 这些函数同时作为筛选器修饰符和返回不同值的表对象的函数。 之所以现在提到这些函数,是因为您可能会找到使用它们移除筛选器的文档和公式示例。
在以下示例中,您将向 Sales 表添加可计算 Revenue 度量值的新度量值,但会通过从 Sales Territory 表中移除筛选器来实现此目标。 将此度量值的格式设置为带有两个小数位数的货币。
Revenue Total Region = CALCULATE([Revenue], REMOVEFILTERS('Sales Territory'))
现在,将 Revenue Total Region 度量值添加到在报表的第 2 页上找到的矩阵视觉对象。 矩阵视觉对象将按“Sales Territory”表中行上的以下三列进行分组:Group、Country 和 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 % Total Region 值为 22.95%。 调查此单元格的筛选器上下文。 切换到数据视图,然后在数据窗格中,选择 Sales Territory 表。
应用以下列筛选器:
- 
              
Group- 北美 - 
              
Country- 美国 - 
              
Region- 西南 
请注意,筛选器会将表减少为仅占一行。 现在,在考虑新目标以创建区域收入占其国家/地区收入的比率时,请从 Region 列中清除筛选器。
请注意,现在有五行,每行都属于“美国”国家/地区。 相应地,当您清除 Region 列筛选器,同时在 Country 和 Group 列上保留筛选器时,您将有一个适用于该区域国家/地区的新筛选器上下文。
在下面的度量值定义中,请注意如何清除或移除列中的筛选器。 在 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%。 这是因为 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
    )
当您从 Sales Territory 表中的 Region 和 Country 列中移除筛选器时,该度量值将计算该区域的收入占其所在组收入的比率。
保留筛选器
您可以使用 KEEPFILTERS 函数作为 CALCULATE 函数中的筛选表达式以保留筛选器。
若要观察如何完成此任务,请切换到报表的第 1 页。 然后,修改 Revenue Red 度量值定义以使用 KEEPFILTERS 函数。
Revenue Red =
CALCULATE(
    [Revenue],
    KEEPFILTERS('Product'[Color] = "Red")
)
在表视觉对象中,请注意,只存在一个 Revenue Red 度量值。 原因在于,布尔筛选表达式保留 Product 表中 Color 列上的现有筛选器。 红色之外的颜色为空的原因是,这两个筛选器结合使用了筛选器上下文和筛选表达式。 黑色和红色是相交的,因为这两种情况不能同时为 TRUE,所以该表达式的筛选方式不是产品行。 只有两个红色筛选器可以同时为 TRUE,这就解释了显示一个 Revenue Red 度量值的原因。
使用非活动关系
仅当 USERELATIONSHIP 函数作为筛选表达式传递给 CALCULATE 函数时,非活动模型关系才能传播筛选器。 使用此函数参与非活动关系时,活动关系将自动变为非活动状态。
查看使用非活动关系按装运日期计算 Revenue 度量值的度量值定义示例:
Revenue Shipped =
CALCULATE (
    [Revenue],
    USERELATIONSHIP('Date'[DateKey], Sales[ShipDateKey])
)
修改关系行为
通过将 CROSSFILTER 函数作为筛选表达式传递给 CALCULATE 函数,您可以在计算表达式时修改模型关系行为。 这是一个高级功能。
              CROSSFILTER 函数可以修改筛选器方向(从两者到单个或从单个到两者),甚至可以禁用关系。