检查筛选器上下文

已完成

VALUES DAX 函数可让你的公式确定筛选器上下文中的值。

VALUES 函数的语法如下所示:

VALUES(<TableNameOrColumnName>)

该函数需要传入表引用或列引用。 当传入表引用时,它将返回一个表对象,该表对象具有相同的列,其中包含筛选器上下文中的行。 当传入列引用时,它将返回筛选器上下文中唯一值的单列表。

该函数始终返回表对象,表可以包含多个行。 因此,若要测试特定值是否在筛选器上下文中,公式必须首先测试 VALUES 函数是否返回了单行。 以下两个函数可以帮助你完成此任务:HASONEVALUESELECTEDVALUE DAX 函数。

当给定的列引用已筛选到单个值时,HASONEVALUE 函数将返回 TRUE

SELECTEDVALUE 函数简化用于确定单个值的任务。 当向函数传递列引用时,它将返回单个值,而当筛选器上下文中有多个值时,它将返回空白(或传递给函数的替换值)。

在下面的示例中,你将使用 HASONEVALUE 函数。 将以下用于计算销售佣金的度量值添加到 Sales 表中。 请注意,在 Adventure Works,佣金费率在所有国家/地区(美国除外)均为收入的 10%。 在美国,销售人员享有 15% 的佣金。 将度量值格式化为带有两个小数位数的货币,然后将其添加到位于报表第 3 页上的表。

Sales Commission =
[Revenue]
    * IF(
        HASONEVALUE('Sales Territory'[Country]),
        IF(
            VALUES('Sales Territory'[Country]) = "United States",
            0.15,
            0.1
        )
    )

图像显示具有三个列的表视觉对象:“区域”、“收入”和“销售佣金”。显示十个区域行和总计。总销售佣金为空白。

请注意,总“销售佣金”结果为空。 原因在于,多个值位于 Sales Territory 表中 Country 列的筛选器上下文中。 在这种情况下,HASONEVALUE 函数将返回 FALSE,这将导致“收入”度量值乘以空白(值乘以空白等于空白)。 若要生成总计,将需要使用迭代器函数,将在本模块后面部分进行说明。

可用于测试筛选器状态的其他三个函数是:

  • ISFILTERED - 如果直接筛选传入的列引用,则返回 TRUE
  • ISCROSSFILTERED - 如果间接筛选传入的列引用,则返回 TRUE。 当应用于同一个表或相关表中其他列的筛选器,通过筛选引用列而影响该列时,将交叉筛选该列。
  • ISINSCOPE - 如果传入的列引用是级别层次结构中的级别,则返回 TRUE

返回到报表第 2 页,然后修改“收入占总国家/地区收入的百分比”度量值定义,以测试 Sales Territory 表中 Region 列是否在范围内。 如果它不在范围内,则度量值结果应为空。

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

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

在矩阵视觉对象中,请注意,仅当区域处于范围内时,才显示“收入占总国家/地区收入的百分比”值。