DAX 第八篇:表连接
表连接是指两张表根据关联字段,组合成一个数据集。表连接不仅可以利用数据模型中已有的关系,而且可以利用DAX表达式基于表的任意列定义连接条件。因此,在DAX中,实现表与表之间的连接,有两种方式:
- 第一种方式:利用数据模型中的现有关系,以便查询包含在不同表中的数据。
- 第二种方式:编写 DAX 表达式创建连接,以生成与关系等效的效果。
一,利用数据模型中的关系(左外连接)
利用数据模型中的关系来连接表,是DAX中最常用的行为,关系隐式实现外连接(LEFT JOIN)。DAX数据模型中的关系分为三种:实线关系,虚线关系和虚拟关系。其中,实线关系是指已经创建的、处于激活状态的关系;虚线关系是指已经创建的、处于未激活状态的关系;虚拟关系是指未创建、只在DAX中临时创建的关系。 数据模型中的关系,要求一方提供唯一值列,因此,只能创建1:M 和 1:1类型的关系,当两个表之间存在多对多的关系时,可以在DAX中使用TREATAS函数创建临时的关系。
例如,FactSales和DimProduct、FactSales和DimDate之间存在多对一的关系,可以利用关系来建立左外连接(LEFT OUTER JOIN),注意,左外联接的左表(保留表)是FactSales,右表是DimDate和DimProduct,这意味着,如果FactSales表中存在的数据不包含在DimProduct或DimDate表中,那么这些数据行都被分到Color为空值(BLANK)或CalendarYear为空值的分组中。
SUMMARIZE(FactSales,DimProduct[Color],DimDate[CalendarYear],"SalesAmount",SUM(FactSales[SalesAmount]))
该DAX表达式等价于以下TSQL脚本,
select p.Color
,d.CalendarYear
,sum(f.SalesAmount) as SalesAmount
from FactSales f
left join DimProduct p
on f.ProductKey=p.ProductKey
left join DimDate d
on f.DateKey=d.DateKey
group by p.Color
,d.CalendarYear
二,利用DAX实现自然连接
自然连接不需要指定连接条件,两个表自动根据同名列进行匹配,前提是同名列的数据类型必须完全相同。在连接期间使用严格的比较语义,没有类型兼容和强制转换,例如,1不等于1.0。
NATURALINNERJOIN(<leftJoinTable>, <rightJoinTable>)
NATURALLEFTOUTERJOIN(<leftJoinTable>, <rightJoinTable>)
这两个函数不要求两个表之间存在关系,但是要求两个表之间存在同名列,并且同名列的数据类型必须完全相同。返回的数据集包含两个表中的同名列和其他列的数据,如果是自然内连接,那么结果集指包含匹配的数据;如果是自然左外连接,那么左表中的数据会全部保留,右表只返回匹配的数据,对于左表中没有匹配的数据,把相应的右表列设置为空值(BLANK)。
三,创建虚拟连接
TREATAS函数用于建立虚拟关系,适合在表和表之间不存在关系时使用:
TREATAS(table_expression, <column>[, <column>[, <column>[,…]]]} )
参数注释:
- table_expression:返回表的表达式
- column:基础表中的列,不能是表达式,column参数的数量必须和table_expression列数相同,并且顺序相同。
返回值:
返回一个表,包含column参数和table_expression参数中匹配的数据行。如果column参数中不包含table_expression中的值,那么忽略该值,也就是说,column参数和table_expression参数使用inner join,只有两方都存在值时,才会返回该值。
例如,表构造器{"Red", "Green", "Yellow"} 创建一个单列三行的表,在DimProduct[Color]列上设置了一个过滤器,过滤器的值只包含“Red”,“Green”和“Yellow”,如果DimProduct [Color]中不存在“Yellow”,则有效滤波器值将为“Red”和“Green”。
TREATAS({"Red", "Green", "Yellow"}, DimProduct[Color])
TREATAS的应用场景,TREATAS()函数用于在表格之间建立虚拟连接,当表之间出现多对多的关系时,此时无法使用关系来建立连接。
例如,在模型中,表DimProduct1 和 DimProduct2之间没有关联,通过TREATAS()函数建立两者之间的连接:
CALCULATE(
SUM(Sales[Amount]),
TREATAS(VALUES(DimProduct1[ProductCategory]), DimProduct2[ProductCategory])
)
四,激活已有的不活跃关系
在引用关系时,DAX可以在查询上下文中临时修改关系的设置,比如引用处于不活跃状态的关系,修改现有关系的交叉过滤的方向设置。重写的关系设置只在查询时有效,不会影响数据模型中的关系设置。
USERELATIONSHIP使用数据模型中已有的关系,用于激活候选关系,通过关系两端的字段来指定关系:
USERELATIONSHIP(<columnName1>,<columnName2>)
在USERELATIONSHIP函数中,关系的状态是不重要的,但是关系必须事先创建于数据模型中,由于活跃的关系在DAX中是可以直接引用的,因此,该函数实际上用于引用处于不活跃(Inactive)状态的关系。
=CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date]))
五,指定交叉过滤的方向
CROSSFILTER 使用数据模型中已有的关系,通过关系两端的字段来指定关系:
CROSSFILTER(<columnName1>, <columnName2>, <direction>)
在CROSSFILTER 中,关系的交叉过滤(cross-filtering)的设置是不重要的,也就是说,不论关系在数据模型中设置为single 方向或both方向,都不会影响函数的使用,CROSSFILTER将覆盖任何现有的交叉过滤(cross-filtering)设置。
参考文档:
DAX 第八篇:表连接的更多相关文章
- 深入理解ajax系列第八篇——表单提交
前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
- Mybatis第四篇【多表连接】
Mybatis多表连接 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所在的部门 ...
- 【译】SQL Server索引进阶第八篇:唯一索引
原文:[译]SQL Server索引进阶第八篇:唯一索引 索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- 第八篇 Replication:合并复制-How it works
本篇文章是SQL Server Replication系列的第八篇,详细内容请参考原文. 在这一系列的前几篇你已经学习了如何在多服务器环境中配置合并复制.这一篇将介绍合并代理并解释它在复制过程中扮演的 ...
- Python之路【第八篇】:堡垒机实例以及数据库操作
Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
随机推荐
- Why do I write a blog
I believe the most beautiful and elegant answer to this question is from Churchill. "On a peace ...
- alluxio源码解析-层次化存储(4)
层次化存储-特性介绍: https://www.alluxio.org/docs/1.6/cn/Tiered-Storage-on-Alluxio.html 引入分层存储后,Alluxio管理的数据块 ...
- JVM运行时数据区--深入理解Java虚拟机 读后感
程序计数器 程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令.占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器.如果线程在执行Java方法,这 ...
- Spring入门(六):条件化的bean
1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些 ...
- java封装 redis 操作 对象,list集合 ,json串
/** * 功能说明: * 功能作者: * 创建日期: * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com */package com.redis.service; import ...
- JavaScript数据结构——图的实现
在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...
- Jmeter使用csv文件读取测试数据
最近有同事在测试过程中遇到需要造批量测试数据的问题,这些数据往往是同一种单据,但是单据的内容不同,如果手工创建就比较费时费力.那我们用jmeter的csv文件来读取测试数据就完美解决了这个问题. 我们 ...
- testng学习笔记-- 场景和module
一.定义 TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Ge ...
- 性能测试学习第四天-----loadrunner:jdbc批量制造测试数据 & controller应用
Javavuser协议 1.过程概述:在eclipse中用java编写sql执行脚本,复制到lr中,调整后通过参数化迭代批量制造测试数据: 2.步骤: 1).在eclipse中新建java proje ...
- 用代码说话:synchronized关键字和多线程访问同步方法的7种情况
synchronized关键字在多线程并发编程中一直是元老级角色的存在,是学习并发编程中必须面对的坎,也是走向Java高级开发的必经之路. 一.synchronized性质 synchronized是 ...