Excel用戶如何學(xué)習(xí)數(shù)據(jù)分析語(yǔ)言DAX?

以下內(nèi)容節(jié)選自《DAX權(quán)威指南:運(yùn)用Power BI、SQL Server Analysis Services和Excel實(shí)現(xiàn)商業(yè)智能分析》一書!

DAX(Data Analysis eXpressions),即數(shù)據(jù)分析表達(dá)式,是Microsoft Power BI、Microsoft SQL Server Analysis Services(SSAS)和Microsoft Power Pivot for Excel中使用的編程語(yǔ)言。
它創(chuàng)建于2010年,是隨PowerPivot的第一個(gè)版本PowerPivot for Excel 2010一起發(fā)布的(在2010年,PowerPivot的拼寫還沒有空格;空格是在2013年引入的)。
隨著時(shí)間的推移,DAX在那些討論P(yáng)ower Pivot數(shù)據(jù)模型的Excel社區(qū)和討論P(yáng)ower BI與SSAS數(shù)據(jù)模型的商業(yè)智能(BI)社區(qū)中逐漸流行起來(lái)。
DAX是一門跨多產(chǎn)品的分析語(yǔ)言,這些產(chǎn)品使用同一個(gè)名為Tabular的內(nèi)部引擎。
出于這個(gè)原因,我們經(jīng)常用表格模型(Tabular Model)作為這些產(chǎn)品的共同特征。
DAX是一門容易理解的語(yǔ)言。
也就是說(shuō),DAX和大多數(shù)編程語(yǔ)言不同,它更容易入門,但熟悉它的一些新概念可能需要一些時(shí)間。
如果你具有Microsoft Excel編程語(yǔ)言經(jīng)驗(yàn),想要學(xué)習(xí)DAX,卻不知如何開始,那么下面就給出一些Excel用戶學(xué)習(xí)DAX的建議。

你可能已經(jīng)知道DAX與Excel公式有些相似。畢竟DAX脫胎于Excel Power Pivot,其開發(fā)團(tuán)隊(duì)試圖保持這兩種語(yǔ)言的相似性,這使得用戶向這種新語(yǔ)言的過(guò)渡更加容易。
然而,它們?nèi)杂幸恍┓浅V匾膮^(qū)別。
Excel對(duì)單元格執(zhí)行計(jì)算,單元格通過(guò)坐標(biāo)引用。因此,你可以這樣編寫公式:
= (A1 * 1.25) - B2DAX處理的是表和列,而不是單元格。
所以,當(dāng)你寫DAX表達(dá)式時(shí),只能引用表和列。
表和列的概念在Excel中司空見慣。實(shí)際上,如果將Excel中的某個(gè)范圍定義為智能表格(使用創(chuàng)建表功能),那么你可以在Excel中編寫引用表和列的表達(dá)式。
在下圖中,你會(huì)看到為SalesAmount列計(jì)算的表達(dá)式引用了同一個(gè)表中的列,而不是工作簿中的單元格。

在Excel中,你可以使用[@ColumnName]格式引用表中的列,其中ColumnName是要引用的列的名稱,@符號(hào)表示“獲取當(dāng)前行的值”。
雖然語(yǔ)法直觀,但通常不會(huì)這樣編寫表達(dá)式,你只需要單擊目標(biāo)單元格,Excel負(fù)責(zé)插入正確的代碼。
你可能認(rèn)為Excel有兩種不同的計(jì)算方式:使用標(biāo)準(zhǔn)單元格引用(在這種情況下,單元格F4中的公式應(yīng)該是E4*D4),或者使用列引用(如果在智能表格中計(jì)算)。
使用列引用的優(yōu)點(diǎn)是,可以在列的所有單元格中使用相同的表達(dá)式,而Excel為每行使用不同的值來(lái)計(jì)算公式。
與Excel不同,DAX只適用于表結(jié)構(gòu),所有表達(dá)式都必須引用表中的列。例如,在DAX中編寫這樣一個(gè)乘法公式:
Sales[SalesAmount] =Sales[ProductPrice] * Sales[ProductQuantity]
在Excel中,不需要提供表名,因?yàn)镋xcel公式在單個(gè)表中計(jì)算。
但是在DAX中,則需要指定表名,因?yàn)镈AX在包含多個(gè)表的數(shù)據(jù)模型中工作,來(lái)自不同表的兩列可能具有相同的名稱。
DAX中的許多函數(shù)與其在Excel中的同名函數(shù)工作原理相同。
例如,IF函數(shù)在 DAX和Excel中是一樣的:
Excel IF ( [@SalesAmount] > 10,1,0)DAX IF ( Sales[SalesAmount] > 10,1,0)
當(dāng)使用DAX時(shí),你不需要刻意指定當(dāng)前行,DAX的默認(rèn)行為是獲取當(dāng)前行中的值。
在Excel中,如果需要引用整列的值,即該列中的所有行,則可以通過(guò)刪除@符號(hào)來(lái)實(shí)現(xiàn),如下圖所示。

換句話說(shuō),引用當(dāng)前行中的值與引用整列的值之間存在語(yǔ)法差異。
DAX則不同。
在DAX中,你可以這樣寫上圖所示的AllSales表達(dá)式:
[AllSales]:= SUM ( Sales[SalesAmount] )獲取列中特定行的值與將列作為一個(gè)整體使用,這兩種用法之間沒有語(yǔ)法差異。
DAX知道你想要對(duì)列的所有值求和,因?yàn)槟阍诰酆虾瘮?shù)(在本例中是SUM函數(shù))中使用了列名作為參數(shù)。因此,雖然Excel在檢索數(shù)據(jù)時(shí)需要用明確的語(yǔ)法來(lái)區(qū)分這兩種類型的數(shù)據(jù),但DAX以一種自動(dòng)的方式消除了歧義。對(duì)于初學(xué)者來(lái)說(shuō),這可能會(huì)讓人困惑。
Excel函數(shù)和DAX這兩種語(yǔ)言非常相似的地方是,它們都是函數(shù)式語(yǔ)言。
函數(shù)式語(yǔ)言是由基礎(chǔ)函數(shù)調(diào)用的表達(dá)式組成的。
在Excel函數(shù)和DAX中都沒有語(yǔ)句、循環(huán)和跳轉(zhuǎn)的概念,而這些概念在許多編程語(yǔ)言中都很常見。
在DAX中,一切都是函數(shù)表達(dá)式。
對(duì)于使用不同語(yǔ)言的程序員來(lái)說(shuō),DAX的這種特性通常是一個(gè)挑戰(zhàn),但對(duì)于Excel用戶來(lái)說(shuō),這一點(diǎn)也不奇怪。
迭代器可能是你遇到的一個(gè)新概念。
在Excel中,你可能習(xí)慣于一步步地執(zhí)行計(jì)算。
在前面的示例中,為了計(jì)算總銷售額,創(chuàng)建了一列,求價(jià)格乘以數(shù)量的結(jié)果,然后將其求和以計(jì)算總銷售額。這個(gè)結(jié)果很有用,例如,它可以作為計(jì)算每個(gè)產(chǎn)品銷售額百分比的分母。
使用DAX,可以通過(guò)使用迭代器在單個(gè)步驟中執(zhí)行相同的操作。迭代器完全按照其名字表示的意思來(lái)執(zhí)行:迭代整個(gè)表,并對(duì)表的每一行執(zhí)行計(jì)算,最后聚合結(jié)果以生成所需的單個(gè)值。
在前面的示例中,可以使用SUMX迭代器計(jì)算總銷售額:
[AllSales]:=SUMX (Sales,Sales[ProductQuantity] * Sales[ProductPrice])
優(yōu)點(diǎn)是,可以在單個(gè)步驟中執(zhí)行許多復(fù)雜的計(jì)算,而不必為此添加許多列,這對(duì)某些特定的公式有用。
缺點(diǎn)是,使用DAX編程的直觀性不如Excel。實(shí)際上,你觀察不到那個(gè)將價(jià)格和數(shù)量相乘的虛擬列,它只是短暫地存在于公式運(yùn)行的時(shí)候。
你仍然可以選擇創(chuàng)建一個(gè)計(jì)算列來(lái)計(jì)算價(jià)格和數(shù)量的乘積。
然而,這不是一個(gè)好的做法,因?yàn)樗褂昧烁嗟膬?nèi)存,并可能會(huì)降低計(jì)算速度,除非你使用了DirectQuery和聚合表。
需要明確的是,學(xué)習(xí)DAX需要先從理論開始,這并非不同編程語(yǔ)言之間的區(qū)別,而是思維方式的不同。
你可能已經(jīng)習(xí)慣于通過(guò)網(wǎng)絡(luò)搜索來(lái)找到解決某個(gè)具體問(wèn)題的復(fù)雜公式或方案。
當(dāng)你使用Excel時(shí),很可能會(huì)發(fā)現(xiàn)有一個(gè)公式幾乎能滿足你的需求。
于是,你復(fù)制這個(gè)公式,稍做修改就解決了問(wèn)題,而不必考慮它的工作原理。
該方法適用于Excel,但不適用于DAX。在能夠?qū)懗龊玫腄AX表達(dá)式之前,你需要學(xué)習(xí)一些理論并徹底理解計(jì)值上下文是如何工作的。
如果沒有一定的理論基礎(chǔ),你會(huì)覺得DAX像變魔術(shù)一樣得到了正確的結(jié)果,或者得到?jīng)]有意義的奇怪?jǐn)?shù)字。但問(wèn)題不在于DAX,而是你還沒有完全理解DAX是如何工作的。
幸運(yùn)的是,DAX的理論只限于幾個(gè)重要的概念,《DAX權(quán)威指南》一書中會(huì)進(jìn)行詳細(xì)介紹。
一旦你掌握了原理,DAX對(duì)你來(lái)說(shuō)就不再神秘了,學(xué)習(xí)DAX主要是積累經(jīng)驗(yàn)。
然而,請(qǐng)不要試圖走得太遠(yuǎn),除非你很好地吸收并掌握了計(jì)值上下文。
記住:了解原理只是成功的一半。


▊《DAX權(quán)威指南》
[意] Marco,Russo(馬爾·科魯索),Alberto,F(xiàn)errari(阿爾貝托·拉里) 著
高飛 譯
DAX里程碑式經(jīng)典教材,亞馬遜4.8分(總分5分)
本書的目的,讓你真正掌握DAX!
微軟MVP,Power BI極客 翻譯
原書作者、DAX之父、ExcelHome 創(chuàng)始人、Power BI MVP力薦
本書是微軟DAX語(yǔ)言在商業(yè)智能分析、數(shù)據(jù)建模和數(shù)據(jù)分析方面的指南。
通過(guò)對(duì)本書的學(xué)習(xí),你將了解如何使用DAX語(yǔ)言進(jìn)行商業(yè)智能分析、數(shù)據(jù)建模和數(shù)據(jù)分析;你將掌握從基礎(chǔ)表函數(shù)到高級(jí)代碼,以及模型優(yōu)化的所有內(nèi)容;你將確切了解在運(yùn)行DAX表達(dá)式時(shí),引擎內(nèi)部所執(zhí)行的操作,并利用這些知識(shí)編寫可以高速運(yùn)行且健壯的代碼。
京東限時(shí)5折,4月30日最后一天!
趕快掃碼下單吧~~
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連 熱文推薦
▼點(diǎn)擊閱讀原文,獲取本書詳情~
