检查筛选器上下文
VALUES
DAX 函数可让你的公式确定筛选器上下文中的值。
VALUES
函数的语法如下所示:
VALUES(<TableNameOrColumnName>)
该函数需要传入表引用或列引用。 当传入表引用时,它将返回一个表对象,该表对象具有相同的列,其中包含筛选器上下文中的行。 当传入列引用时,它将返回筛选器上下文中唯一值的单列表。
该函数始终返回表对象,表可以包含多个行。 因此,若要测试特定值是否在筛选器上下文中,公式必须首先测试 VALUES
函数是否返回了单行。 以下两个函数可以帮助你完成此任务:HASONEVALUE
和 SELECTEDVALUE
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
)
)
在矩阵视觉对象中,请注意,仅当区域处于范围内时,才显示“收入占总国家/地区收入的百分比”值。