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。
参考文档: