导语:USERELATIONSHIP函数本身很简单,但经常需要和CALCULATE函数结合使用,这时,问题就开始变得很复杂,而反过来说,通过理解USERELATIONSHIP参与计算的过程,也能加深对CALCULATE函数的理解。
【本文稍长,DAX内容要讲透不容易,且核心内容需要仔细思考,建议收藏并耐心阅读。】
USERELATIONSHIP函数本身并不复杂,它的功能就是将存在的未激活的表间关系给激活,同时,把原已激活的关系(如果存在的话)给停掉。
比如,本文案例包含date、customer、employee、order、detail等5张表并建立了相应的关系,其中date和order间包含1个激活的日期指向订购日期的关系以及1个未激活的日期指向发货日期的关系:
在这个模型里,如果要通过日期表指向发货日期进行计算,则可以通过公式USERELATIONSHIP('date'[日期],'order'[发货日期])来实现。这时日期表和发货日期之间的关系将被激活,而同时,原来表里面的指向订购日期的关系将被停用。
但是,在实际工作中,USERELATIONSHIP往往不是单独使用,而是和CALCULATE函数结合在一起,这时,很容易碰到以下问题:
1、USERELATIONSHIP函数改变的表关系(新关系)到底在什么时候起作用?
2、新关系起作用之前,旧关系如何影响CALCULATE函数的筛选参数?
3、如果希望新关系在计算开始就起作用,该怎么办?
为解开以上谜团,我从简单到复杂构造了4个度量,使得在customer选择了“千固、实翼”,日期选择了7月15日的情况下,得到了完全不同的计算结果:
在继续阅读之前,建议先思考并记下自己对这4个度量的计算过程的理解,以便和我给出的理解做个对比,有疑问可以进一步留言互相讨论,共同进步。
数据下载链接:https://t.zsxq.com/05UrZzjm2
一、度量1:在原关系下计算
.销量 = SUM('detail'[数量])
完整“备拷转调叠算”过程
(在学习DAX的过程中,沉下心来反复把CALCULATE函数的计值流搞清楚非常重要!不熟悉CALCULATE函数该6字步骤的朋友建议查阅文章666,Calculate计值流记不住?我提炼成了这6个字!| DAX核心知识):
二、度量2:启用未激活关系
.销量_urs2 =
CALCULATE(
[.销量],
USERELATIONSHIP('date'[日期],'order'[发货日期])
)
完整“备拷转调叠算”过程:
三、度量3:新旧关系对显式筛选器的影响
.销量_urs2&filter =
CALCULATE(
[.销量],
VALUES('order'[雇员]),
ALL('customer'[客户]),
USERELATIONSHIP('date'[日期],'order'[发货日期])
)
完整“备拷转调叠算”过程:
四、度量4:如何从一开始就启用新关系?
.销量_urs&filter_usr2 =
CALCULATE(
CALCULATE(
[.销量],
VALUES('order'[雇员]),
ALL('customer'[客户]),
USERELATIONSHIP('date'[日期],'order'[订购日期])
),
USERELATIONSHIP('date'[日期],'order'[发货日期])
)
完整计算过程(外层CALCULATE简述):
一、外层CALCULATE函数:无显式筛选器,拷贝【雇员】(全部)、【客户】(千固、实翼)、【日期】(7月15日)筛选器,并通过USERELATIONSHIP参数调整【日期】筛选器指向【发货日期】;
二、内层CALCULATE函数
最后总结一下:
1、USERELATIONSHIP将存在的未激活的表间关系给激活,同时,把原已激活的关系(如果存在的话)给停掉。
2、在同一个CALCULATE函数内,USERELATIONSHIP在第四步“调”之后才会起作用,在这之前,显式筛选参数的计算仍使用原表间关系;
3、如果要使显式筛选器可以使用新关系,可以在其所在的CALCULATE函数外再嵌套一层CALCULATE并使用USERELATIONSHIP函数。
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!