DAX是一种专门用于计算数据模型的业务公式的语言,本文以Power BI的关系来学习数据模型。 一,理解数据模型数据模型是由一组表和关系构成的结构,表和表之间由关系链接,如下图所示的产品数据模型: 表格是组织数据的二维结构,由行和列构成,其本身是一个最简单的数据模型。当要描述更复杂的数据模型时,就需要使用多张表。在具有多个表的数据模型中,表和表之间的数据具有关联性,通过关系把相关联的两个表连接起来,并设置关系的类型和方向。 关系用于连接两个表,是数据模型的重要组成部分,关系具有以下几个特点:
二,理解关系关系有两个属性:类型和方向,在Power BI中,创建的关系需要指定关系的类型(Cardinality)和关系的方向(Cross filter direction),如下图所示: 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 = SUMMARIZECOLUMNS ( DimCustomers[FullName], "SumOfSales", SUM (FactSales[SalesAmount]) ) 在DAX中不需要像TSQL那样显示指定连接的条件,DAX根据FactSales表和DimCustomers表之间关系,推断出销售和客户之间的关系,自动跟随模型计算出按照FullName分组后每个客户的所有订单总额。
参考文档: |
|