DAX:表值函数 VALUES和DISTINCT

表值函数 VALUES, DISTINCT 都用于返回一列的唯一值,唯一的区别是处理表种空行的行为不同。

当关系代表的约束无效时,数据模型会再关系的“一”端的任何表中自动创建一个空行,这就是空值的由来,也就是说,在一个1:M的关系中,如果“多”端在“一”端没有对应的值,那么数据模型默认把BLANK作为值来关联“多”端。

一,VALUES函数

VALUES函数收到过滤上下文的影响,并可以添加BLANK行。

当输入参数是列名时,返回一个包含来自指定列的唯一值的单列表,其重复值被删除,只返回唯一值。当输入参数输入参数是表名时,返回指定表中的行,其重复的行被保留。 可以添加空白行。

VALUES(<TableNameOrColumnName>) 

注意:当在已过滤的上下文中使用 VALUES 函数时,VALUES 返回的唯一值会受到过滤器的影响。

例如,如果按地区过滤,并返回城市值的列表,则该列表将仅包括过滤器允许的地区中的那些城市。 要返回所有城市,无论现有过滤器如何,都必须使用 ALL 函数从表中删除过滤器。

二,DISTINCT函数

DISTINCT函数的结果受当前过滤器上下文的影响,返回一个包含指定列的唯一值的单列表。 换句话说,重复值被删除,只返回唯一值。

DISTINCT(<column>)

The VALUES function is similar to DISTINCT; it can also be used to return a list of unique values, and generally will return exactly the same results as DISTINCT. However, in some context VALUES will return one additional special value. For more information, see VALUES function.

三,VALUES函数和DISTINCT函数的异同

相同之处,DISTINCT函数和VALUES函数的结果受当前过滤器上下文的影响。

在大多数情况下,当参数为列名时,VALUES 函数的结果与 DISTINCT 函数的结果相同,这两个函数都删除重复项并返回指定列的唯一值的列表。但是,存在一种特殊情况,如果从相关表中查找时,如果在一个表中缺少关系中引用的值,那么这会导致VALUES 函数返回的结果中被添加一个BLANK值,此空白值很有用。在数据库术语中,这被称为违反参照完整性。 当一个表正在更新而相关联的表没有更新时,可能会发生这种数据不匹配的情况。

四,使用SELECTEDVALUE代替VALUES的情况

尽管VALUES函数是一个表值函数,但是由于DAX的一个特性,单行单例的表可以像标量一样使用,也可以使用VALUES来计算标量值,例如:

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

推荐使用SELECTEDVALUE函数,性能更高,代码更简单:

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

1,HASONEVALUE函数

当 columnName 的上下文被过滤成一个值时,返回 TRUE,否则为假。

HASONEVALUE(<columnName>) 

这个函数等价于:COUNTROWS(VALUES(<columnName>)) = 1

2,SELECTEDVALUE函数

当 columnName 的上下文被过滤成一个值时,返回该值,否则返回alternateResult。

SELECTEDVALUE(<columnName>[, <alternateResult>])

这个函数的结果等价于:

IF(HASONEVALUE(<columnName>), VALUES(<columnName>), <alternateResult>)

参考文档:

VALUES

Use SELECTEDVALUE instead of VALUES