检查筛选器上下文
通过使用 VALUES 函数,公式可以确定筛选器上下文中的值。
VALUES 函数语法如下:
VALUES(<TableNameOrColumnName>)
该函数需要传入表引用或列引用。 当传入表引用时,它将返回一个包含相同列的表对象,这些列中包含筛选器上下文中的行。 当传入列引用时,它将返回筛选器上下文中唯一值的单列表。
该函数始终返回表对象,表可以包含多个行。 因此,若要测试特定值是否在筛选器上下文中,公式必须首先测试 VALUES 函数是否返回一行。 以下两个函数可帮助您完成此任务:HASONEVALUE 和 SELECTEDVALUE 函数。
当给定列引用筛选为单个值时,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 Commission 度量值结果为空值。 原因在于,多个值位于 Sales Territory 表中 Country 列的筛选器上下文中。 在此情况下,HASONEVALUE 函数返回 FALSE,这将导致 Revenue 度量值乘以空值(一个值乘以空值,结果为空值)。 若要生成总计,您需要使用迭代程序函数,本模块稍后会对此进行说明。
可用于测试筛选器状态的其他三个函数是:
-
ISFILTERED- 如果直接 筛选传入的列引用,则返回TRUE。 -
ISCROSSFILTERED- 如果间接 筛选传入的列引用,则返回TRUE。 当应用于同一个表或相关表中其他列的筛选器通过筛选引用列而影响该列时,将交叉筛选该列。 -
ISINSCOPE- 当传入的列引用是级别层次结构中的级别时,则返回TRUE。
返回到报表的第 2 页,然后修改 Revenue % Total Country 度量值定义以测试 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
)
)