使用 SELECTEDVALUE 而不是 VALUES

作为数据建模器,有时可能需要编写一个 DAX 表达式来测试列是否按特定值进行筛选。

在早期版本的 DAX中,使用涉及三个 DAX 函数的模式可以安全地实现此要求;IFHASONEVALUEVALUES。 以下度量值定义提供了一个示例。 它计算销售税金额,但仅适用于向澳大利亚客户进行的销售额。

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

在此示例中,仅当当前筛选器上下文中可见 国家/地区 列的单个值时,HASONEVALUE 函数才会返回 TRUE。 如果为 TRUE,VALUES 函数将与“澳大利亚”文本进行比较。 VALUES 函数返回 TRUE 时,“销售额”度量值将乘以 0.10(表示 10%)。 如果 HASONEVALUE 函数返回 FALSE,因为多个值会筛选列,则第一个 IF 函数返回 BLANK。

使用 HASONEVALUE 是一种防御技术。 之所以需要这样做,是因为“国家/地区” 列可能会有多个值进行筛选。 在这种情况下,VALUES 函数返回多行的表。 将多行表与标量值进行比较会导致错误。

建议

建议使用 SELECTEDVALUE 函数。 它实现的结果与本文中所述的模式相同,但更高效、更优雅。

使用 SELECTEDVALUE 函数时,现在将重写示例度量值定义。

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

提示

可以将 备用结果 值传递到 SELECTEDVALUE 函数中。 如果没有筛选器(或多个筛选器)应用于该列,则返回备用结果值。