DAX:表值函数 VALUES、DISTINCT和FILTERS

表值函数 VALUES, DISTINCT 都用于返回一列的唯一值,唯一的区别是:VALUES()会额外添加一个BLANK。当使用VALUES函数从一个关联表中获取唯一值时,如果某一个值在关系中缺失,那么VALUES()函数会返回BLANK()。

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

 一,VALUES函数

VALUES函数收到过滤上下文的影响,当使用VALUES函数从一个关联表中获取唯一值时,如果某一个值在关系中缺失,那么VALUES()函数会返回BLANK()。

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

VALUES(<TableNameOrColumnName>) 

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

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

二,DISTINCT函数

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

DISTINCT(<column>)

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

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

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

DISTINCT函数可以消除循环依赖。

四,使用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>)

五,FILTERS函数

FILTERS函数返回被当前筛选上下文直接筛选的值,即过滤器直接应用到 <columnName> 的值。

FILTERS(<columnName>) 

跟VALUES函数的重要区别是:VALUES函数返回筛选上下文中的可见值,而FILTERS函数返回被筛选上下文直接筛选的值。

举个例子,报表上有一个Color切片器,直接筛选了Red,Green和Blue三种颜色,由于筛选上下文中还存在其他切片器,因此报表中可能只有Red和Green可见,也就是说,Blue被其他切片器过滤掉了。在这种情况下,VALUES函数只会返回Red和Green,而FILTERS函数会返回被直接筛选的所有Color,即Red,Green和Blue。

 

参考文档:

VALUES

Use SELECTEDVALUE instead of VALUES

posted @ 2022-05-18 21:40  悦光阴  阅读(1299)  评论(0编辑  收藏  举报