DAX查詢進階:駕駛DAX Studio
沒有愛上車是因為還沒學會駕駛。
前情回顧
在上一篇DAX查詢入門:DAX Studio介紹中,我們已經初步了解了DAX Stuido。
它提供的能力包括:DAX查詢編寫
DAX查詢/DAX代碼格式化
數據模型元數據查看
當前DAX引擎支持函數查看
當前DAX引擎DMV
DAX查詢結果查看
DAX查詢結果數據導出
DAX引擎運行監控(為代碼優化做準備)
DAX引擎時間跟蹤
DAX代碼性能優化
我們初步了解了:Excel透視表可以用等效的DAX查詢表示
DAX查詢可以表示出任意複雜的查詢結果,這種能力遠遠超過Excel透視表本身
DAX Studio是編寫DAX查詢的強大武器
DAX Studio除了編寫DAX查詢外,還具備其他更多特性
理解如何藉助DAX Studio完成DAX查詢與Excel的連接
理解如何直接在原生Excel中實現DAX查詢
理解如何在Power BI Desktop中進行DAX查詢
理解如何藉助DAX Studio測試DAX查詢(返回表或返回值)
本文將詳細說明暢快駕駛DAX Studio的方法。
現在打開你的DAX Studio以及示例文件Contoso.pbix(你可以使用自己的測試文件)。如下:
DAX查詢編寫
DAX查詢的語法為:
根據 微軟官方DAX查詢參考 可知:DAX 語言提供了一種新語法,可從查詢中返回表數據。通過 DAX 查詢,用戶可從內存分析引擎 (VertiPaq) 來檢索由表表達式定義的數據。 用戶可將度量值作為查詢的一部分創建;查詢結束後,這些結果會被釋放,除非導出這些結果。DAX 查詢 的語法如下:
[DEFINE { MEASURE <tableName>[<name>] = <expression> }EVALUATE <table>[ORDER BY {<expression> [{ASC | DESC}]}[, …][START AT {<value>|<parameter>} [, …]]]
具體參考微軟官方文檔,不做過多說明。
其中,EVALUATE是重點。包含用於生成查詢結果的表表達式。 表達式可以使用任何定義的度量值。表達式必須返回表。 如果需要標量值,則度量值的作者可以將其標量包裝在 ROW() 函數內,以便生成包含所需標量的表。
在DAX中,常見的返回表的情況包括:
直接返回表本身,如:
EVALUATE Product
返回被過濾的表,如:
EVALUATEFILTER ( "Product", "Product"[Color] = "red" )
返回CACULATETABLE計算後的表,如:
EVALUATECALCULATETABLE ( DISTINCT ( "Product"[Product Name] ), "Product Category"[Category] = "audio")
ALL和VALUES也是返回表的函數,在DAX Studio中可以很好的看到它們的特性,如:
EVALUATEALL("Product Category"[Category])EVALUATEVALUES("Product Category"[Category])
結果如下:
注意:DAX Studio 2.6 開始支持返回多結果,也就是一次性寫多個EVALUATE進行計算。
另外一個結果是:
發現了嗎?ALL和VALUES在這種情況下返回的結果是一樣的。你還可以自行實驗有 重複值 列的情況。
流暢的代碼編寫體驗
之所以說當你熟悉了DAX的感覺後會不能再沒有她,正是因為她能幫助你流暢地編寫DAX代碼。這表現在:
DAX 函數及模型元數據智能感知,如:
DAX Studio 可以自動識別當前DAX引擎可用的DAX函數以及當前模型的元數據(表及列)並迅速進行提示,這使得編寫代碼的速度很快。
DAX 代碼著色及格式化
DAX Studio 使用http://DAXFormatter.com對代碼進行格式化,如下:
點擊:
得到:
在編寫複雜的 DAX 查詢 時,代碼著色以及括弧匹配能幫助我們避免很多錯誤。
語法檢測及錯誤提醒
如果你的代碼出現錯誤,DAX Studio可以進行語法檢查並幫助排除錯誤。例如在上述的DAX查詢中,對[Category Code]不小寫多寫了一個空格成為[Category Code ],這也是不允許的,DAX Studio會報錯,如下:
DAX Studio 幫助鎖定了出錯的位置是第4行第17列,並提示了錯誤信息「找不到列Category Code 或該列不能用於此表達式」。
DAX 查詢編寫最佳實踐
基於DAX查詢具有的特點:DAX查詢是嵌套進行的。可以逐層地來構造查詢,以確保在每一步都可以進行調試。
注意利用 DAX Studio 2.6 版本以後可返回多結果的功能。
例如:構建一個返回分類及子分類下銷售額匯總的表。這個在DAX Studio中逐步編寫代碼的過程大致如下:
DEFINE //定義度量值計算銷售額 MEASURE Sales[Total Sales] = SUMX ( Sales, Sales[Net Price] * Sales[Quantity] )EVALUATE//總銷售額ROW ( "values", [Total Sales] )EVALUATE//生成類別層級表SELECTCOLUMNS ( GENERATE ( "Product Category", RELATEDTABLE ( "Product Subcategory" ) ), "Category", "Product Category"[Category], "Sub Category", "Product Subcategory"[Subcategory])EVALUATE//為類別層級表添加銷量ADDCOLUMNS ( SELECTCOLUMNS ( GENERATE ( "Product Category", RELATEDTABLE ( "Product Subcategory" ) ), "Category", "Product Category"[Category], "Sub Category", "Product Subcategory"[Subcategory] ), "Total Sales", [Total Sales])
可以看出在上述過程中,並沒有刪除每一步的代碼,而總是利用每一次的代碼繼續下一步。並得到結果:
可以發現,有的類別層級組合是沒有銷售額的,不希望顯示這樣的結果,於是可以進一步用FILTER來進行過濾,甚至進一步格式化輸出結果,如下:
EVALUATE//為類別層級表添加銷量並過濾空行//格式化輸出結果FILTER ( ADDCOLUMNS ( SELECTCOLUMNS ( GENERATE ( "Product Category", RELATEDTABLE ( "Product Subcategory" ) ), "Category", "Product Category"[Category], "Sub Category", "Product Subcategory"[Subcategory] ), "Total Sales", FORMAT( [Total Sales] / 10000 , "0.0W" ) ), ISBLANK ( [Total Sales] ) = FALSE () && [Total Sales] <> "")
結果為:
這已經很完美。
尤其是在編寫複雜的 DAX 查詢 時,可以採用逐步測試的方法並配合注釋使得DAX代碼可以被長期維護。
使用DAX Studio理解模型中的元數據
DAX Studio可以幫助分析師了解模型的元數據,如下:
包括Power BI Desktop自動生成的代碼,例如:Power BI Desktop會自動為每個日期列添加一個適用於時間智能的隱藏日期表。這個隱藏的日期表在Power BI Desktop默認是看不到的,但是在DAX Studio中卻一覽無遺。
如果禁用Power BI Desktop自動生成日期表的功能,如下:
此時回到DAX Studio中查看模型的元數據將不再存在隱藏的日期表,如下:
使用DAX Studio理解所有DAX函數
DAX Studio可以讀取DAX引擎支持的所有函數,如下:
這可以幫助分析師快速了解所有的DAX函數,包括DAX引擎更新後可能新加入的函數。
使用DAX Studio初步理解DMV並使用Power BI Desktop作為分析服務
Analysis Services Dynamic Management Views (DMV),即:分析服務的動態管理視圖,它提供了對當前運行的分析服務動態信息進行查詢的介面。如下:
由於Excel Power Pivot,Power BI Desktop以及SSAS均使用分析服務引擎,所以都具備這個DMV。通過查詢DMV,用戶可以知道由於當前分析服務的幾乎所有信息,這為基於Power BI Desktop的高級應用提供了基礎。
例如:DMV透露了作為當前分析服務的實例,那便可以使用該實例作為伺服器。將Excel作為客戶端,與之進行連接。
這裡顯示了埠號:
用Excel作為客戶端工具與之連接,如下:
輸入剛剛在DAX Studio中得到的連接信息,如下:
Excel提示可以與當前的分析服務連接,如下:
此時,在Power BI Desktop定義的模型便可以直接在Excel中使用了,如下:
至此,Excel與Power BI Desktop完全連接起來,不需要在Excel中建立數據模型一樣可以直接對數據模型加以利用。
有關DMV的深度利用,超出了本文範圍,後續再做描述。
使用DAX Studio輸出DAX查詢
這又是一項DAX Studio非常出彩的功能。我們知道在Excel中單表限制是100W行數據;而在Power BI Desktop中又無法導出數據。這就存在一個問題,那就是:是否可能將載入進數據模型(Excel 數據模型或Power BI Desktop數據模型)的大數據量級事實表(如:超過1000W行)導出?
對於分析師而言,這是一個非常重要的功能。這項功能也是由DAX Studio提供的。
在示例PBI文件中便使用了多達1200W行的銷售數據,如下:
EVALUATEROW ( "rows of sales", COUNTROWS ( Sales ) )
結果:
這甚至不能只能在DAX Studio的輸出視圖中顯示,這有可能導致內存不足。但可以通過DAX Studio把輸出目標改為文件,這樣就像在內存數據模型與硬碟目標文件之間建立了管道,數據像流水一樣,順暢地流入目標文件。
在DAX Studio設置輸出目標為:
執行這項「危險」的操作如下:
EVALUATESales
執行查詢,並設置保存的文件格式為CSV格式:
DAX Studio大致以每秒15000行的速度導出數據:
如果此時觀察任務管理器,可以看到:
DAX Studio進程以全速工作,並以1.5~2M/S每秒的速度與磁碟交互,在它身邊正是Power BI Desktop啟動的本地分析服務。
導出結果如下:文件大小為2G。Power BI Desktop源文件(包含Sales在內所有模型表)整個大小為300M。DAX引擎的壓縮能力在此也可見一斑。
分析師電腦配置在硬碟方面使用固態硬碟便是為此處考慮。增加硬碟的讀寫速度,對於大數據量級數據讀寫有明顯優勢。
總結
至此,現在我們已經可以基本駕駛DAX Studio完成大多數DAX查詢相關工作,包括:
流暢地編寫DAX查詢。
使用DAX Studio實現逐步編寫DAX查詢。
使用DAX Studio學習理解所有DAX函數。
使用DAX Studio理解模型的元數據。
初步使用DAX Studio理解DMV。
使用DAX Studio導出DAX查詢。
如果說現在已經可以通過DAX Studio暢快地駕駛DAX查詢,那還有最後一個階段,那就是:透徹地理解DAX引擎,完成修車,彎道急速超車等高難度動作。
推薦<<極品飛車>>這一電影,其中一個片段是:
有好車,不一定人人能開出極速。所有的分析師都可以使用Power BI Desktop,但真正的高手是能開出極速的。
其中還有一個片段:
夢想,比工作更重要。
這兩個片段,你找到了嗎?
對於如何像電影的感覺一般與DAX查詢為伍將在第三篇章中繼續探索。
如果你對本文感興趣,歡迎分享到你的朋友圈。後台留言便可獲取示例文件。aHR0cDovL3dlaXhpbi5xcS5jb20vci9xRHFMazJMRUt6OVVyU2J3OTJfNg== (二維碼自動識別)
推薦閱讀:
※實戰②:如何用圖表來表現滿額減後原售價、單本折扣額、折後單價三者的關係
※太神奇了,Excel居然還能做動畫版的《海上明月圖》,潮起潮落的海水、閃爍的星星、滾動的字幕,一樣不少
※Excel數據可視化分析方法大全
※001-自定義函數處理腦殘數據計算
TAG:MicrosoftExcel | PowerBI |