DAX:RELATED函数和ROW CONTEXT
在DAX中,每个表都有一个与之匹配的扩展表,表的扩展版本包含了原始表的所有列,以及从源表开始的多对一关系链中位于关系“一”端的表的所有行。
不管关系的类型如何变化,表扩展的规则是相同的:
- 表的扩展是单向的,只能从基准表的开始,并把任何位于关系“一”端的相关表的所有列添加到基准表中。
- 表的扩展不止第一层,只需要按照多对一的关系前进,就可以把更多的“一”端的表添加到基准表中。
- 无论扩展是从关系的哪一端开始,扩展始终向关系的“一”端延伸。
对于一对一的关系,从表的两端都可以扩展。注意,关系的方向不是不是表扩展的方向。
扩展表可以解释筛选上下文是如何通过关系传递的,一旦DAX筛选了位于关系“一”端的任何列,它就筛选了扩展版本中包含该列的数据行集,也就是说,包含了关系“多”端的所有表。
通过扩展表来理解RELATED函数,扩展的行为发生在定义表时,而不是在使用表时。RELATED函数并不执行任何操作,而是访问扩展表的相关列。因此,RELATED函数使用在扩展表创建时处于活动状态的关系,返回相关联字段的值。
RELATED 函数
RELATED 函数表示从跟当前行有关系的另外一个表中返回一个值,通常用于关系的1:M关系的1端,注意是,返回的是单个值。也就是说,从当前行开始,返回模型中跟当前行有关的一个值。如果要返回多个值,请使用RELATEDTABLE函数。
因此,RELATED 函数要求当前表与包含相关数据的表之间存在关联(也就是关系)。
注意:RELATED 函数需要行上下文;因此,它只能用于计算列表达式(其中当前行上下文明确)中,或者用作使用表扫描函数的表达式中的嵌套函数。表扫描函数(例如 SUMX)会获取当前行的值,然后扫描另一个表以查找该值的实例。
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 ( ) )
参考文档: