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 是什么? https://www.jianshu.com/p/82d0cd9273ae
来源: https://www.cnblogs.com/ljhdo/p/11201671.html