前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这个案例彻底理解USERELATIONSHIP,还能加深CALCULATE的理解!|DAX核心

这个案例彻底理解USERELATIONSHIP,还能加深CALCULATE的理解!|DAX核心

作者头像
大海Power
发布2024-05-11 13:48:00
1130
发布2024-05-11 13:48:00
举报

导语: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:在原关系下计算

代码语言:javascript
复制
.销量 = SUM('detail'[数量])

完整“备拷转调叠算”过程

在学习DAX的过程中,沉下心来反复把CALCULATE函数的计值流搞清楚非常重要!不熟悉CALCULATE函数该6字步骤的朋友建议查阅文章666,Calculate计值流记不住?我提炼成了这6个字!| DAX核心知识):

  • 备:无显式筛选器,跳过;
  • 拷:【客户】为“实翼、千固”,【日期】“7月15日”
  • 转:无行上下文,跳过;
  • 调:无调节参数,跳过;
  • 叠:无新增或调整筛选器,只有原始的【客户】和【日期】筛选器;最终,【客户】筛选出模型中客户为“实翼、千固”的内容;此时日期表和订单表间激活的关系指向【订购日期】,所以【日期】会筛选出订购日期为“7月15日”的数据(60,41)。具体见下图。
  • 算:60+41=101

二、度量2:启用未激活关系

代码语言:javascript
复制
.销量_urs2 =
CALCULATE(
  [.销量],
  USERELATIONSHIP('date'[日期],'order'[发货日期])
)

完整“备拷转调叠算”过程:

  • 备:无显式筛选器,跳过;
  • 拷:【客户】为“实翼、千固”,【日期】“7月15日”;
  • 转:无行上下文,跳过;
  • 调:USERELATIONSHIP参数将日期表和订单表间的关系调整为指向【发货日期】;
  • 叠:无额外筛选器,只有原始的【客户】和【日期】筛选器。最终,【客户】筛选出模型中客户为“实翼、千固”的内容;但此时日期表和订单表间激活的关系指向【发货日期】,所以【日期】筛选器会筛选出发货日期为“7月15日”的数据(27,41);
  • 算:27+41=68

三、度量3:新旧关系对显式筛选器的影响

代码语言:javascript
复制
.销量_urs2&filter =
CALCULATE(
  [.销量],
   VALUES('order'[雇员]),
   ALL('customer'[客户]),
  USERELATIONSHIP('date'[日期],'order'[发货日期])
)

完整“备拷转调叠算”过程:

  • 备:在原始上下文(【客户为“千固、实翼”】、【日期】指向【订购日期】,值为“7月15日”)中计算显式筛选参数VALUES(‘order’[雇员]),得到订单表【雇员】为“郑建杰、李芳”;(下图中绿色部分)
  • 拷:【客户】为“实翼、千固”,【日期】为“7月15日”,'employee'表【雇员】为全部;
  • 转:无行上下文,跳过;
  • 调:USERELATIONSHIP参数将日期表和订单表间的关系调整为指向【发货日期】;ALL(‘customer’[客户])参数删除【客户】筛选器的影响;
  • 叠:增加了显式筛选器VALUES(‘order’[雇员]),值为“郑建杰、李芳”,与拷贝下来的全部’employee’[雇员]取交集,仍为“郑建杰、李芳”,【日期】仍为“7月15日”,但此时日期表和订单表间激活的关系指向【发货日期】,所以,最终筛选出雇员为“郑建杰、李芳”,【发货日期】为“7月15日”的数据(41,105);(下图中红色部分)
  • 算:41+105=146

四、度量4:如何从一开始就启用新关系?

代码语言:javascript
复制
.销量_urs&filter_usr2 =
CALCULATE(
  CALCULATE(
      [.销量],
       VALUES('order'[雇员]),
       ALL('customer'[客户]),
      USERELATIONSHIP('date'[日期],'order'[订购日期])
  ),
  USERELATIONSHIP('date'[日期],'order'[发货日期])
)

完整计算过程(外层CALCULATE简述):

一、外层CALCULATE函数:无显式筛选器,拷贝【雇员】(全部)、【客户】(千固、实翼)、【日期】(7月15日)筛选器,并通过USERELATIONSHIP参数调整【日期】筛选器指向【发货日期】;

二、内层CALCULATE函数

  • 备:在原始上下文(外层CALCULATE函数的结果上)计算显式筛选参数VALUES(‘order’[雇员]),得到值为“赵军、李芳”;(下图绿色部分)
  • 拷:【客户】为“实翼、千固”,【日期】为“7月15日”,'employee'[雇员]为全部;
  • 转:无行上下文,跳过;
  • 调:USERELATIONSHIP参数将日期表和订单表间的关系调整为指向【订购日期】;ALL(‘customer’[客户])参数删除【客户】筛选器的影响;
  • 叠:增加了显式筛选器VALUES(‘order’[雇员]),值为“赵军、李芳”,与拷贝下来的全部’employee’[雇员]取交集,仍为“赵军、李芳”,【日期】仍为“7月15日”,但此时日期表和订单表间激活的关系指向【订购日期】,所以,最终筛选出雇员为“赵军、李芳”,【订购日期】为“7月15日”(只有李芳)的数据(41);(下图红色部分)
  • 算:41

最后总结一下:

1、USERELATIONSHIP将存在的未激活的表间关系给激活,同时,把原已激活的关系(如果存在的话)给停掉。

2、在同一个CALCULATE函数内,USERELATIONSHIP在第四步“调”之后才会起作用,在这之前,显式筛选参数的计算仍使用原表间关系;

3、如果要使显式筛选器可以使用新关系,可以在其所在的CALCULATE函数外再嵌套一层CALCULATE并使用USERELATIONSHIP函数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel到PowerBI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档