DAX:扩展表和RELATED函数
在DAX中,每个表都有一个与之匹配的扩展表,表的扩展版本包含了原始表的所有列,以及从源表开始的多对一关系链中位于关系“一”端的表的所有行。
不管关系的类型如何变化,表扩展的规则是相同的:
- 表的扩展是单向的,只能从基准表的开始,并把任何位于关系“一”端的相关表的所有列添加到基准表中。
- 表的扩展不止第一层,只需要按照多对一的关系前进,就可以把更多的“一”端的表添加到基准表中。
- 无论扩展是从关系的哪一端开始,扩展始终向关系的“一”端延伸。
对于一对一的关系,从表的两端都可以扩展。注意,关系的方向不是不是表扩展的方向。
扩展表可以解释筛选上下文是如何通过关系传递的,一旦DAX筛选了位于关系“一”端的任何列,它就筛选了扩展版本中包含该列的数据行集,也就是说,包含了关系“多”端的所有表。
通过扩展表来理解RELATED函数,扩展的行为发生在定义表时,而不是在使用表时。RELATED函数并不执行任何操作,而是访问扩展表的相关列。因此,RELATED函数使用在扩展表创建时处于活动状态的关系,返回相关联字段的值。
举个例子,利用CALCULATETABLE创建两个表变量,并指定Sales和DimDate之间的关系,SalesA表和SalesB表的扩展表就会不一样,使用RELATED函数获取到的DimDate[Date]的含义就会不同。
var SalesA = CALCUALTETABLE(Sales, USERELATIONSHIP(Sales[Order Date], DimDate[Date]) ) var SalesB = CALCUALTETABLE(Sales, USERELATIONSHIP(Sales[Delivery Date], DimDate[Date]))
由于RELATED函数需要行上下文,在无法使用RELATED函数的情况下,可以使用LOOKUPVALUE函数,LOOKUPVALUE函数总是忽略筛选上下文查找值。
LOOKUPVALUE ( table[result_column], table[search_column_1], <expression_1>, table[search_column_2], <expression_2>, <alternate_result> )
可以使用以下代码来实现LOOKUPVALUE函数:
CALCULATE ( SELECTEDVALUE ( table[result_column], <alternate_result> ), FILTER ( ALLNOBLANKROW ( table[search_column_1] ), table[search_column_1] == <expression_1> ), FILTER ( ALLNOBLANKROW ( table[search_column_2] ), table[search_column_2] == <expression_2> ), REMOVEFILTERS ( ) )
参考文档:
作者:悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。