DAX从入门到精通 5-8 学习userelationship函
calculate还有另外一个可以好用的功能就是,它可以激活一个关系,并用于计算。事实上,按你知道的,数据模型中,会存在激活和未激活的关系。存在未激活的关系,是因为在两个表中,你有多种关系同时存在,而我们只能保持一个关系是激活的。
例如。在数据模型中,sales表中每行可能分别记录着order date和 deliverydate。然后,通常情况下,我们做的分析都是基于order date,但是对于一些特别的指标,我们可能要基于delivery date。这样的情况下,我们会在date表和sales表建立两个关系:一个基于orderdatekey,一个基于deliverydatekey。但是每次只有一个关系是活动的,因为通常使用order date分析,所以我们把orderdatekey作为活动的,其他的关系作为不激活。然后,我们可能需要展示一个基于deliverydate的指标,用来对比基于orderdate的值。这个新的指标Delivered Amount计算的时候要使用非激活状态的关系,同时,要把order date改为非激活状态。
这个场景下,我们使用calculate和userelationship结合,用下面的代码:
[Delivered Amount] :=
CALCULATE (
[Sales Amount],
USERELATIONSHIP ( Sales[DeliveryDateKey], Date[DateKey] )
)
在计算Delivered Amount的时候,deliverydatekey和datekey的关系会被激活,然后同时,orderdatekey会被设置未非活动状态。在下图的透视表中,我们可以看到sales amount基于orderdatekey 以及新的Delivered Amount。
image.png
当使用userelationship去激活一个关系的时候,我们要注意一个重要的地方:关系是在数参照的时候定义的,而不是在related等函数使用的时候定义的。
例如,如果你要计算2007年发货的金额的时候,这个函数就是不工作的。
[Delivered Amount in 2007] :=
CALCULATE (
[Sales Amount],
FILTER (
Sales,
CALCULATE (
RELATED ( Date[CalendarYear] ),
USERELATIONSHIP ( Sales[DeliveryDateKey], Date[DateKey] )
) = 2007
)
这里的原因是,使用filter迭代sales表,然后计算出了上下文,在这个过程中改变了激活的关系,然后引入了related。但是sales表和date表的关系是在引入sales表就定义好了,而不是在使用related的时候。
如果你要计算上面这个案例,你需要重新改下,按下面的写法:
[Delivered Amount in 2007] :=
CALCULATE (
[Sales Amount],
FILTER (
CALCULATETABLE (
Sales,
USERELATIONSHIP( Sales[DeliveryDateKey], Date[DateKey] )
),
RELATED ( Date[Calendar Year] ) = 2007
))
这这个函数里面,先使用calculate激活了关系,然后引入sales表。因此filter中的related计算的就是deliverydatekey激活的状态。
这个特点使得在计算列表达式中使用非默认关系变得复杂,因为表的引用,是在计算列被定义的时候。因此,你不能控制这个,你也就不能使用calculate和userelationship改变这个关系。
---------------------第五章节完成----------大家幸苦啦------------------------------