表值函数 VALUES, DISTINCT 都用于返回一列的唯一值,唯一的区别是:VALUES()会额外添加一个BLANK。当使用VALUES函数从一个关联表中获取唯一值时,如果某一个值在关系中缺失,那么VALUES()函数会返回BLANK()。
当关系代表的约束无效时,数据模型会再关系的”一”端的任何表中自动创建一个空行,这就是空值的由来,也就是说,在一个1:M的关系中,如果”多”端在”一”端没有对应的值,那么数据模型默认把BLANK作为值来关联”多”端。
一,VALUES函数
当输入参数是列名时,返回一个包含来自指定列的唯一值的单列表,其重复值被删除,只返回唯一值。当输入参数输入参数是表名时,返回指定表中的行,其重复的行被保留。
注意:当在已过滤的上下文中使用 VALUES 函数时,VALUES 返回的唯一值会受到过滤器的影响。
例如,如果按地区过滤,并返回城市值的列表,则该列表将仅包括过滤器允许的地区中的那些城市。 要返回所有城市,无论现有过滤器如何,都必须使用 ALL 函数从表中删除过滤器。
二,DISTINCT函数
DISTINCT函数的结果受当前过滤器上下文的影响,返回一个包含指定列的唯一值的单列表。 换句话说,重复值被删除,只返回唯一值。
三,VALUES函数和DISTINCT函数的异同
相同之处,DISTINCT函数和VALUES函数的结果受当前过滤器上下文的影响。
在大多数情况下,当参数为列名时,VALUES 函数的结果与 DISTINCT 函数的结果相同,这两个函数都删除重复项并返回指定列的唯一值的列表。但是,存在一种特殊情况,如果从相关表中查找时,如果在一个表中缺少关系中引用的值,那么这会导致VALUES 函数返回的结果中被添加一个BLANK值,此空白值很有用。在数据库术语中,这被称为违反参照完整性。 当一个表正在更新而相关联的表没有更新时,可能会发生这种数据不匹配的情况。
DISTINCT函数可以消除循环依赖。
四,使用SELECTEDVALUE代替VALUES的情况
尽管VALUES函数是一个表值函数,但是由于DAX的一个特性,单行单例的表可以像标量一样使用,也可以使用VALUES来计算标量值,例如:
推荐使用SELECTEDVALUE函数,性能更高,代码更简单:
当 columnName 的上下文被过滤成一个值时,返回 TRUE,否则为假。
这个函数等价于:COUNTROWS(VALUES(
当 columnName 的上下文被过滤成一个值时,返回该值,否则返回alternateResult。
这个函数的结果等价于:
五,FILTERS函数
FILTERS函数返回被当前筛选上下文直接筛选的值,即过滤器直接应用到
跟VALUES函数的重要区别是:VALUES函数返回筛选上下文中的可见值,而FILTERS函数返回被筛选上下文直接筛选的值。
举个例子,报表上有一个Color切片器,直接筛选了Red,Green和Blue三种颜色,由于筛选上下文中还存在其他切片器,因此报表中可能只有Red和Green可见,也就是说,Blue被其他切片器过滤掉了。在这种情况下,VALUES函数只会返回Red和Green,而FILTERS函数会返回被直接筛选的所有Color,即Red,Green和Blue。
参考文档:
Original: https://www.cnblogs.com/ljhdo/p/14630106.html
Author: 悦光阴
Title: DAX:表值函数 VALUES、DISTINCT和FILTERS
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552516/
转载文章受原作者版权保护。转载请注明原作者出处!