DAX 第一篇:數據模型


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是什么?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM