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 ( )
)

 

 

参考文档:

posted @ 2020-02-24 22:54  悦光阴  阅读(463)  评论(0编辑  收藏  举报