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

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

作者头像
大海Power
发布于 2024-05-11 05:48:00
发布于 2024-05-11 05:48:00
69800
代码可运行
举报
运行总次数:0
代码可运行

导语: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
代码运行次数:0
运行
AI代码解释
复制
.销量 = SUM('detail'[数量])

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.销量_urs2 =
CALCULATE(
  [.销量],
  USERELATIONSHIP('date'[日期],'order'[发货日期])
)

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.销量_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
代码运行次数:0
运行
AI代码解释
复制
.销量_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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Calculate计值流,DAX最重要知识点,没有之一!
1、为什么先写好度量[最大日期],然后在Calculate的筛选条件里调用,却不能得到正确的结果呢?filter是行上下文应该不具备筛选功能?
大海Power
2021/08/31
2K0
CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战
一个使用了CALCULATE函数的公式,到底是怎么样计算得到它的结果的?如果没有真正搞懂CALCULATE函数计值流(计算过程)的话,即使这个公式很简单,也可能会无法理解!
大海Power
2022/05/25
1.8K0
CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战
关于CALCULATE函数,初学者特别容易混淆的问题之一! | DAX实战案例
DAX里的CALCULATE函数,无疑是最强大、最重要、最灵活而又最难懂的函数,没有之一。
大海Power
2022/05/25
1K0
关于CALCULATE函数,初学者特别容易混淆的问题之一! | DAX实战案例
calculate函数更改筛选器,到底是怎么回事儿?|DAX原理
导语:备,拷,转,调,叠,算,我一遍又一遍地重复这6个字,只为让大家看到一个有calculate函数的公式,尤其是当其结果和自己想的不一样时,可以条件反射式地把这6个步骤应用进去——这是我这一年多来对DAX最重要的总结,没有之一!
大海Power
2024/01/17
5150
calculate函数更改筛选器,到底是怎么回事儿?|DAX原理
《DAX进阶指南》-第6章 动态可视化
开始本章翻译时,是5月初。当时并不知道平平无奇的5月Power BI会带来一大波更新,尤其是大杀器“字段参数”(字段参数参考文章)。
陈学谦
2022/10/30
5.9K0
《DAX进阶指南》-第6章 动态可视化
Extreme DAX-第4章 上下文和筛选
编写 DAX 公式时要掌握的核心概念是上下文。DAX 作为一门动态数据分析语言,与 Excel 函数、SQL 查询 和 Power Query 脚本有着根本不同的原因就在于上下文的概念。以上所述的所有其他语言的公式只会在数据发生变化时才会返回不同的结果(除了一些例外情况,例如使用参数时),但是单个 DAX 公式就可以同时提供多个不同的结果,具体取决于您使用它的位置和方式,也就是:上下文。
陈学谦
2022/05/24
5.9K1
Extreme DAX-第4章 上下文和筛选
Extreme DAX-第3章 DAX 的用法
Power BI 模型的真正强大之处在于通过使用 DAX 语言进行计算。虽然许多 Power BI 用户专注于模型并试着完全避开使用 DAX,但是除了最简单的基础聚合运算以外,其他所有的计算都需要通过 DAX 来实现。而且,你迟早会在 Power BI 中遇到更复杂的计算需求。根据我们的经验,典型的情况会是:你精心制作的一个 Power BI 报告初稿,会引出有关这些数据的越来越多、越来越复杂的问题。
陈学谦
2022/05/24
7.4K0
Extreme DAX-第3章 DAX 的用法
Extreme DAX-第 2 章 模型设计
设计优良的分析模型是 DAX 高效运行的前提。在本章中,我们将讨论许多与建模有关的主题,这些主题对于理解性能强劲的模型设计非常重要。
陈学谦
2022/05/24
3.6K0
Extreme DAX-第 2 章 模型设计
【万字长文】数仓最全知识点整理(建议收藏)
数据仓库 Data Warehouse,是为企业所决策制定过程,提供所有支持类型的数据集合。用于分析性报告和决策支持。数仓是一个面向主题、集成的、相对稳定、反映历史变化的数据集合,随着大数据技术的发展,其作用不再局限于决策分析、还可以为业务应用、审计、追踪溯源等多方面提供数据支撑,帮助企业完成数字化转型。
857技术社区
2022/05/17
15.2K0
【万字长文】数仓最全知识点整理(建议收藏)
Kettle构建Hadoop ETL实践(五):数据抽取
本篇介绍如何利用Kettle提供的转换步骤和作业项实现Hadoop数据仓库的数据抽取,即ETL过程中的Extract部分。首先简述Kettle中几种抽取数据的组件,然后讲述变化数据捕获(Change Data Capture,CDC),以及Kettle如何支持不同的CDC技术。Hadoop生态圈中的Sqoop工具可以直接在关系数据库和HDFS或Hive之间互导数据,而Kettle支持Sqoop输入、输出作业项。最后我们使用Kettle里的Sqoop作业项以及基于时间戳的CDC转换实现销售订单示例的数据抽取过程,将MySQL中的源数据抽取到Hive的rds数据库中。
用户1148526
2020/10/10
7.2K0
Kettle构建Hadoop ETL实践(五):数据抽取
LeetCode 数据库专题
写一段SQL查询来展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。你可以以 任意 顺序返回结果表。查询结果的格式如下例所示:
wywwzjj
2023/05/09
1.5K0
LeetCode 数据库专题
MySQL 从入门到实践,万字详解!
数据库是往全栈发展不得不跨过的一道坎,大家不可避免会学到用到相关知识,最近查资料的时候发现网上很多内容要么就特别深,要么不成体系,对一些希望浅尝辄止仅仅是使用一下的人不太友好。最近刚好有机会学到 MySQL,集中一些时间学习了一下 MySQL 同时做了一些笔记,每个概念基本都有代码示例,每一行都是在下手打,读者可以直接复制了代码到命令行中运行,希望对大家有所帮助~ 😜 本文介绍的知识都不是特别深,目标用户是对 MySQL 零基础或弱基础的小伙伴们,可以帮助对 MySQL 建立一些概念,至少碰到相关问题知道
前端下午茶
2022/03/22
2.1K0
MySQL 从入门到实践,万字详解!
Kettle构建Hadoop ETL实践(七):定期自动执行ETL作业
一旦数据仓库开始使用,就需要不断从源系统给数据仓库提供新数据。为了确保数据流的稳定,需要使用所在平台上可用的任务调度器来调度ETL定期执行。调度模块是ETL系统必不可少的组成部分,它不但是数据仓库的基本需求,也对项目的成功起着举足轻重的作用。
用户1148526
2020/10/26
6.5K0
Kettle构建Hadoop ETL实践(七):定期自动执行ETL作业
DAX中的基础表函数
👆点击“博文视点Broadview”,获取更多书讯 本文将介绍DAX中的基础表函数。 表函数是DAX中的一种常规函数,它返回的结果不是一个标量值,而是一个表。当需要编写DAX查询和迭代表的高级计算时,表函数非常有用。本文会介绍相关的计算示例。 本文的目标是介绍表函数的概念,而并非提供所有DAX表函数的详细说明。 《DAX权威指南》一书的第12章和第13章中介绍了更多的表函数。本文将解释DAX中最常见和重要的表函数的作用,以及如何在常见的场景中,包括标量表达式中使用它们。 01 表函数介绍 到目前为止,你
博文视点Broadview
2023/05/06
2.8K0
DAX中的基础表函数
一个小时学会MySQL数据库
该文是对一篇新闻文章的摘要总结。
张果
2018/01/04
4K0
一个小时学会MySQL数据库
Zipline 3.0 中文文档(三)
此版本更新了 Zipline,使其与 Python >= 3.7 以及当前版本的 Pandas、scikit-learn 等相关的 PyData 库兼容。
ApacheCN_飞龙
2024/05/16
8210
Mycat 核心配置详解
由上图可以看到 Mycat 的核心配置文件均采用xml格式,这几个配置文件的用途如下:
端碗吹水
2020/09/23
1.5K0
Mycat 核心配置详解
Java补充之MySQL入门必备知识
mysql5.5 mysql5.6 mysqI5.7(稳定) mysql8 更高版本
timerring
2023/05/24
1.5K0
Java补充之MySQL入门必备知识
Zipline 3.0 中文文档(二)
交易日历代表单个市场交易所的时间信息。时间信息由两部分组成:时段和开/闭市时间。这由 Zipline 的TradingCalendar类表示,并作为所有新的TradingCalendar类的父类。
ApacheCN_飞龙
2024/05/16
2940
java核心技术第二篇之数据库SQL语法
#查询products表记录 SELECT * FROM products WHERE price > 2000; – 单行注释 /* 多行注释 */ #创建数据库 CREATE DATABASE hei66_day19_db;hei66_day19_db #查看数据库 SHOW DATABASES; #查看某个数据库的定义信息 SHOW CREATE DATABASE hei66_day19_db; #删除数据库 DROP DATABASE hei66_day19_db;
海仔
2019/08/05
1.1K0
相关推荐
Calculate计值流,DAX最重要知识点,没有之一!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验