表连接是指两张表根据关联字段,组合成一个数据集。表连接不仅可以利用数据模型中已有的关系,而且可以利用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 联接表系列(三)

TREATAS

USERELATIONSHIP

DAX 第八篇:表连接的更多相关文章

  1. 深入理解ajax系列第八篇——表单提交

    前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...

  2. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  3. Mybatis第四篇【多表连接】

    Mybatis多表连接 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来 ...

  4. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

    多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所在的部门 ...

  5. 【译】SQL Server索引进阶第八篇:唯一索引

    原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...

  6. Python之路【第十八篇】:Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  7. 第八篇 Replication:合并复制-How it works

    本篇文章是SQL Server Replication系列的第八篇,详细内容请参考原文. 在这一系列的前几篇你已经学习了如何在多服务器环境中配置合并复制.这一篇将介绍合并代理并解释它在复制过程中扮演的 ...

  8. Python之路【第八篇】:堡垒机实例以及数据库操作

    Python之路[第八篇]:堡垒机实例以及数据库操作   堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient ...

  9. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

随机推荐

  1. vue中使用vue-amap(高德地图)

    因为项目要求调用高德地图,就按照官方文档按部就班的捣鼓,这一路上出了不少问题. 前言: vue-cli,node环境什么的自己安装设置推荐一个博客:https://blog.csdn.net/wula ...

  2. 优雅的对象转换解决方案-MapStruct使用进阶(二)

    在前面, 介绍了 MapStruct 及其入门. 本文则是进一步的进阶. 在 MapStruct 生成对应的实现类的时候, 有如下的几个情景. 1 属性名称相同,则进行转化 在实现类的时候, 如果属性 ...

  3. L1005矩阵取数游戏

    #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for ( ...

  4. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)

    本来这次想好好写一下博客的...结果耐心有限,又想着烂尾总比断更好些.于是还是把后续代码贴上.不过后续代码是继续贴在BNF容器里面的...可能会显得有些臃肿.但目前管不了那么多了.先贴上来吧hhh.说 ...

  5. 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

    题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...

  6. springboot-jsp打jar问题

    [**前情提要**]最近做了一个项目,项目是springboot+jsp结构的,但是在发布生产环境的时候又需要用maven打成jar包,但是一开始的默认配置都不成功.下面的文章就是具体的解决过程. - ...

  7. SpringBoot:Web开发

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 , 基于atguigu 1.5.x 视频优化 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处 ...

  8. Jersey用户指南学习笔记1

    Jersey用户指南是Jersey的官方文档, 英文原版在这:https://jersey.github.io/documentation/latest/index.html 中文翻译版在这:http ...

  9. PCB学习总结

    一.电子设计流程概述:项目立项------元件创库----------原理图设计-----------封装绘制-------pcb设计--------生产文件的输出--------pcb文件加工 二. ...

  10. Python 類別 class 的繼承 Inheritance

    既然 Python 是面向物件 Object Oriented 語言,它就有類別 Class 與物件 Object 的概念. 甚麼是類別 class ? 簡單講: 類別好比蓋房子的施工藍圖 Blue ...