DAX是一种专门用于计算数据模型的业务公式的语言,本文以Power BI的关系来学习数据模型。

一,理解数据模型

数据模型是由一组表和关系构成的结构,表和表之间由关系链接,如下图所示的产品数据模型:

表格是组织数据的二维结构,由行和列构成,其本身是一个最简单的数据模型。当要描述更复杂的数据模型时,就需要使用多张表。在具有多个表的数据模型中,表和表之间的数据具有关联性,通过关系把相关联的两个表连接起来,并设置关系的类型和方向。

关系用于连接两个表,是数据模型的重要组成部分,关系具有以下几个特点:

  • 用来创建关系的列(通常在两个表中都有相同的名称)被称为关系的键。
  • 在表格数据模型中,关系只能在单列上创建。多列关系不被引擎支持。
  • 关系的类型有两种:一对一(1:1),一对多(1:*)。
  • 根据关系的类型,关系两端的表承担的角色是不同的,在一对多关系中,1端称为关系的一方,多端称为关系的多方。
  • 在关系的一方,关系的列是表的主键,值是唯一的。在关系的多方,关系的列在多方表中允许存在重复值。
  • 在每一个关系中,都有一个或两个小箭头。箭头指示自动过滤关系的方向。
  • 关系按照方向可以形成一个链条,在链条上可以对数据进行过滤。

二,理解关系

关系有两个属性:类型和方向,在Power BI中,创建的关系需要指定关系的类型(Cardinality)和关系的方向(Cross filter direction),如下图所示:

1,关系的类型

关系的类型有两种:1对1,1对多

  • 1对1 :表示关系两端的列都是唯一列,不存在重复值;
  • 1对多 :表示关系两端的列,1方是唯一列,不存在重复值;而多方的列允许存在重复值。

关系的类型是由关系两端的列值的唯一性决定的,当列值是唯一时,该端是“1方”,当列值允许存在重复值时,该端是“多方”。

注:PowerBI支持多对多关系。

2,关系的方向

在关系中,箭头的方向就是关系的方向,箭头指示在应用关系时对值进行自动过滤的方向。在Power BI中,关系的方向有Single和Both两种,分别表示单向和双向。

每一个关系都有一个或两个方向的过滤,过滤总是从关系的一方到多方。如果关系是双向的(也就是说,它有两个箭头),那么过滤也会从多方到单方。

关系的方向跟计算的上下文有很大的关系,对CALCULATE()函数计算的结果影响非常大。

三,理解关系的工作方式

SQL查询和DAX之间存在很多的相似性,SQL和DAX之间最明显的区别在于模型中的关系工作方式。

在SQL查询中,你可以在表格之间设置外键来声明关系,但是引擎在查询中从不使用这些外键,除非你对它们很明确。例如,如果你有一个客户表和一个销售表,其中CustomerKey是客户的主键和销售中的外键,那么你可以编写一个查询:

SELECT c.FullName as CustomerName,
SUM ( s.SalesAmount ) AS SumOfSales
FROM dbo.FactSales s
LEFT JOIN dbo.DimCustomers c
ON s.CustomerKey = c.CustomerKey
GROUP BY c.FullName
order by c.FullName

即使您使用外键声明了模型中的关系,您仍然需要显式地在查询中声明联接条件。但是,在DAX中,关系是模型的一部分,它们都是外部连接。一旦在模型中定义了,您就不再需要在查询中指定联接类型:当您使用与主表相关的列时,DAX在查询中使用一个自动的左外连接。因此,您可以在DAX中编写和以上TSQL等价的查询:

SumOfSalesTable = SUMMARIZE (
FactSales,
DimCustomers[FullName],
"SumOfSales", SUM (FactSales[SalesAmount])
)

在DAX中不需要像TSQL那样显示指定连接的条件,DAX根据FactSales表和DimCustomers表之间关系,推断出销售和客户之间的关系,自动跟随模型计算出按照FullName分组后每个客户的所有订单总额。

对SUMMARIZE()函数做一个小结:

结论1,主表和相关表的连接是左外连接

FactSales是主表,主表和其相关的列使用左外连接,这就意味着,如果主表FactSales中插入DimCustomers中不存在值,那么FullName会显示为Blank。

我做了个实验,向FactSales表中插入一个无效的CustomerKey:

在刷新PowerBI的FactSales表之后,发现DAX中的FullName列多了一个空值:

 结论2,主表是多方

在SUMMARIZE函数连接两个表时,主表是多方。

参考文档:

【DAX圣经】第一章:DAX是什么?

DAX 第一篇:数据模型的更多相关文章

  1. Zookeeper 入门第一篇

    转载原文地址: ZooKeeper学习总结 第一篇:ZooKeeper快速入门 ZooKeeper学习总结 第二篇:ZooKeeper深入探讨 ZooKeeper学习第一期---Zookeeper简单 ...

  2. Entity Framework 6.0 入门系列 第一篇

    Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...

  3. Flink入门-第一篇:Flink基础概念以及竞品对比

    Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...

  4. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...

  5. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  6. Three.js 第一篇:绘制一个静态的3D球体

    第一篇就画一个球体吧 首先我们知道Three.js其实是一个3D的JS引擎,其中的强大之处就在于这个JS框架并不是依托于JQUERY来写的.那么,我们在写这一篇绘制3D球体的文章的时候,应该注意哪些地 ...

  7. 深入学习jQuery选择器系列第一篇——基础选择器和层级选择器

    × 目录 [1]id选择器 [2]元素选择器 [3]类选择器[4]通配选择器[5]群组选择器[6]后代选择器[7]兄弟选择器 前面的话 选择器是jQuery的根基,在jQuery中,对事件处理.遍历D ...

  8. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. Android基础学习第一篇—Project目录结构

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

随机推荐

  1. 一款好用的视频转换gif的小软件——抠抠视频秀

           在平常生活中,我们拍下来精彩的视频想要转换为gif动画,或是想要录制网页上的视频.电脑上的鼠标操作等等,大家可以使用以下这款很好用的视频转换gif的小软件——抠抠视频秀,这个软件操作简单 ...

  2. 一个技术人,最重要的是:极客精神(好奇心 + 探索欲)(新de代码)

    一个技术人,最重要的是:极客精神(好奇心 + 探索欲) 初到社会,面对众多的IT企业,我们是陌生与好奇的,认为所有企业都是管理一流并且高大上等的.然而工作多年以后你会发现,国内的IT企业环境良莠不齐, ...

  3. SQLSERVER 数据库备份脚本-支持多库备份

    原文:SQLSERVER 数据库备份脚本-支持多库备份 <pre name="code" class="sql">--变量定义 DECLARE @b ...

  4. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  5. 关于SetLocaleInfo()

    原文:关于SetLocaleInfo() 此函数用于设置系统的一些本地信息, 非常有用. 比如日期格式为'yyyy/mm/dd'时, 稍微不注意,有些程序语句会报错. 以下资料网络收集: 1. Set ...

  6. wp8.1之拍照(获取焦点,使用后置摄像头)

    wp8.1 没有像wp8一样直接用启动器开启摄像头,他要开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流.今天讲讲如何打开摄像头,获取焦点,以及拍照.废话不多说 ...

  7. .net EF Join 关联表分页查询

    Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...

  8. Java MaxDirectMemorySize

    Refer to for detail: https://dzone.com/articles/default-hotspot-maximum-direct-memory-size 1. Java d ...

  9. 用C实现OOP面向对象编程(1)

    如摘要所说,C语言不支持OOP(面向对象的编程).并这不意味着我们就不能对C进行面向对象的开发,只是过程要复杂许多.原来以C++的许多工作,在C语言中需我们手动去完成. 博主将与大家一起研究一下如下用 ...

  10. c#与JAVA利用SOCKET实现异步通信的SanNiuSignal.DLL已开源

    大家好,前段时间C#的SanNiuSignal.DLL已开源;因部分用户特需要JAVA版的SanNiuSignal;现在只能把半成品先拿出来暂时给他们用了,以后再慢慢改进; JAVA版目前已实现跟C# ...