Excel用戶如何學習數據分析語言DAX?

以下內容節選自《DAX權威指南:運用Power BI、SQL Server Analysis Services和Excel實現商業智能分析》一書!


--正文--

DAX(Data Analysis eXpressions),即數據分析表達式,是Microsoft Power BI、Microsoft SQL Server Analysis Services(SSAS)和Microsoft Power Pivot for Excel中使用的編程語言。

它創建於2010年,是隨PowerPivot的第一個版本PowerPivot for Excel 2010一起發佈的(在2010年,PowerPivot的拼寫還沒有空格;空格是在2013年引入的)。

隨着時間的推移,DAX在那些討論Power Pivot數據模型的Excel社區和討論Power BI與SSAS數據模型的商業智能(BI)社區中逐漸流行起來。

DAX是一門跨多產品的分析語言,這些產品使用同一個名爲Tabular的內部引擎。

出於這個原因,我們經常用表格模型(Tabular Model)作爲這些產品的共同特徵。

DAX是一門容易理解的語言

也就是說,DAX和大多數編程語言不同,它更容易入門,但熟悉它的一些新概念可能需要一些時間。

如果你具有Microsoft Excel編程語言經驗,想要學習DAX,卻不知如何開始,那麼下面就給出一些Excel用戶學習DAX的建議

你可能已經知道DAX與Excel公式有些相似。畢竟DAX脫胎於Excel Power Pivot,其開發團隊試圖保持這兩種語言的相似性,這使得用戶向這種新語言的過渡更加容易。

然而,它們仍有一些非常重要的區別。

01

單元格和智能表格

Excel對單元格執行計算,單元格通過座標引用。因此,你可以這樣編寫公式:

= (A1 * 1.25) - B2

DAX則不同,單元格和座標的概念在DAX中不存在。

DAX處理的是表和列,而不是單元格。

所以,當你寫DAX表達式時,只能引用表和列。

表和列的概念在Excel中司空見慣。實際上,如果將Excel中的某個範圍定義爲智能表格(使用創建表功能),那麼你可以在Excel中編寫引用表和列的表達式。

在下圖中,你會看到爲SalesAmount列計算的表達式引用了同一個表中的列,而不是工作簿中的單元格。

在Excel中,你可以使用[@ColumnName]格式引用表中的列,其中ColumnName是要引用的列的名稱,@符號表示“獲取當前行的值”。

雖然語法直觀,但通常不會這樣編寫表達式,你只需要單擊目標單元格,Excel負責插入正確的代碼。

你可能認爲Excel有兩種不同的計算方式:使用標準單元格引用(在這種情況下,單元格F4中的公式應該是E4*D4),或者使用列引用(如果在智能表格中計算)。

使用列引用的優點是,可以在列的所有單元格中使用相同的表達式,而Excel爲每行使用不同的值來計算公式。

與Excel不同,DAX只適用於表結構,所有表達式都必須引用表中的列。例如,在DAX中編寫這樣一個乘法公式:

Sales[SalesAmount] =

Sales[ProductPrice] * Sales[ProductQuantity]

如你所見,每個列都以表名爲前綴。

在Excel中,不需要提供表名,因爲Excel公式在單個表中計算。

但是在DAX中,則需要指定表名,因爲DAX在包含多個表的數據模型中工作,來自不同表的兩列可能具有相同的名稱。

DAX中的許多函數與其在Excel中的同名函數工作原理相同。

例如,IF函數在 DAX和Excel中是一樣的:

Excel IF ( [@SalesAmount] > 10,1,0)

DAX IF ( Sales[SalesAmount] > 10,1,0)

Excel函數的語法和DAX的一個不同之處是引用整列的方式。你可能已經注意到,[@ ProductQuantity]中的@表示“當前行中的值”。

當使用DAX時,你不需要刻意指定當前行,DAX的默認行爲是獲取當前行中的值。

在Excel中,如果需要引用整列的值,即該列中的所有行,則可以通過刪除@符號來實現,如下圖所示。

AllSales列在所有行中的值都是相同的,因爲它是SalesAmount列的總計。

換句話說,引用當前行中的值與引用整列的值之間存在語法差異。

DAX則不同。

在DAX中,你可以這樣寫上圖所示的AllSales表達式:

[AllSales]:= SUM ( Sales[SalesAmount] )

獲取列中特定行的值與將列作爲一個整體使用,這兩種用法之間沒有語法差異。

DAX知道你想要對列的所有值求和,因爲你在聚合函數(在本例中是SUM函數)中使用了列名作爲參數。因此,雖然Excel在檢索數據時需要用明確的語法來區分這兩種類型的數據,但DAX以一種自動的方式消除了歧義。對於初學者來說,這可能會讓人困惑。

02

Excel函數和DAX:兩種函數式語言

Excel函數和DAX這兩種語言非常相似的地方是,它們都是函數式語言。

函數式語言是由基礎函數調用的表達式組成的。

在Excel函數和DAX中都沒有語句、循環和跳轉的概念,而這些概念在許多編程語言中都很常見。

在DAX中,一切都是函數表達式。

對於使用不同語言的程序員來說,DAX的這種特性通常是一個挑戰,但對於Excel用戶來說,這一點也不奇怪。

03

使用迭代器

迭代器可能是你遇到的一個新概念。

在Excel中,你可能習慣於一步步地執行計算。

在前面的示例中,爲了計算總銷售額,創建了一列,求價格乘以數量的結果,然後將其求和以計算總銷售額。這個結果很有用,例如,它可以作爲計算每個產品銷售額百分比的分母。

使用DAX,可以通過使用迭代器在單個步驟中執行相同的操作。迭代器完全按照其名字表示的意思來執行:迭代整個表,並對錶的每一行執行計算,最後聚合結果以生成所需的單個值。

在前面的示例中,可以使用SUMX迭代器計算總銷售額:

[AllSales]:=

SUMX (

     Sales,

     Sales[ProductQuantity] * Sales[ProductPrice]

)

這種方法既有優點也有缺點。

  • 優點是,可以在單個步驟中執行許多複雜的計算,而不必爲此添加許多列,這對某些特定的公式有用。
  • 缺點是,使用DAX編程的直觀性不如Excel。實際上,你觀察不到那個將價格和數量相乘的虛擬列,它只是短暫地存在於公式運行的時候。

你仍然可以選擇創建一個計算列來計算價格和數量的乘積。

然而,這不是一個好的做法,因爲它使用了更多的內存,並可能會降低計算速度,除非你使用了DirectQuery和聚合表。

03

DAX相關理論

需要明確的是,學習DAX需要先從理論開始,這並非不同編程語言之間的區別,而是思維方式的不同。

你可能已經習慣於通過網絡搜索來找到解決某個具體問題的複雜公式或方案。

當你使用Excel時,很可能會發現有一個公式幾乎能滿足你的需求。

於是,你複製這個公式,稍做修改就解決了問題,而不必考慮它的工作原理。

該方法適用於Excel,但不適用於DAX。在能夠寫出好的DAX表達式之前,你需要學習一些理論並徹底理解計值上下文是如何工作的。

如果沒有一定的理論基礎,你會覺得DAX像變魔術一樣得到了正確的結果,或者得到沒有意義的奇怪數字。但問題不在於DAX,而是你還沒有完全理解DAX是如何工作的。

幸運的是,DAX的理論只限於幾個重要的概念,《DAX權威指南》一書中會進行詳細介紹。

一旦你掌握了原理,DAX對你來說就不再神祕了,學習DAX主要是積累經驗。

然而,請不要試圖走得太遠,除非你很好地吸收並掌握了計值上下文。

記住:瞭解原理只是成功的一半。

▊《DAX權威指南》

[意] Marco,Russo(馬爾·科魯索),Alberto,Ferrari(阿爾貝託·拉里) 著

高飛 譯

  • DAX里程碑式經典教材,亞馬遜4.8分(總分5分)
  • 本書的目的,讓你真正掌握DAX!
  • 微軟MVP,Power BI極客 翻譯
  • 原書作者、DAX之父、ExcelHome 創始人、Power BI MVP力薦

本書是微軟DAX語言在商業智能分析、數據建模和數據分析方面的指南。

通過對本書的學習,你將瞭解如何使用DAX語言進行商業智能分析、數據建模和數據分析;你將掌握從基礎表函數到高級代碼,以及模型優化的所有內容;你將確切瞭解在運行DAX表達式時,引擎內部所執行的操作,並利用這些知識編寫可以高速運行且健壯的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章