![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-30-49.jpg)
沒有愛上車是因為還沒學會駕駛。
前情回顧
在上一篇DAX查詢入門:DAX Studio介紹中哄孤,我們已經初步了解了DAX Stuido去扣。
它提供的能力包括:
- DAX查詢編寫
- DAX查詢/DAX代碼格式化
- 數據模型元數據查看
- 當前DAX引擎支持函數查看
- 當前DAX引擎DMV
- DAX查詢結果查看
- DAX查詢結果數據導出
- DAX引擎運行監(jiān)控(為代碼優(yōu)化做準備)
- DAX引擎時間跟蹤
- DAX代碼性能優(yōu)化
我們初步了解了: - 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(你可以使用自己的測試文件)浙滤。如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-07-50.jpg)
DAX查詢編寫
DAX查詢的語法為:
根據 微軟官方DAX查詢參考 可知:
DAX 語言提供了一種新語法伶授,可從查詢中返回表數據为黎。
通過 DAX 查詢组砚,用戶可從內存分析引擎 (VertiPaq) 來檢索由表表達式定義的數據。 用戶可將度量值作為查詢的一部分創(chuàng)建违诗;查詢結束后某抓,這些結果會被釋放纸兔,除非導出這些結果。
DAX 查詢 的語法如下:
[DEFINE { MEASURE <tableName>[<name>] = <expression> }
EVALUATE <table>
[ORDER BY {<expression> [{ASC | DESC}]}[, …]
[START AT {<value>|<parameter>} [, …]]]
具體參考微軟官方文檔否副,不做過多說明汉矿。
其中,EVALUATE是重點备禀。包含用于生成查詢結果的表表達式洲拇。 表達式可以使用任何定義的度量值奈揍。表達式必須返回表。 如果需要標量值赋续,則度量值的作者可以將其標量包裝在 ROW() 函數內男翰,以便生成包含所需標量的表。
在DAX中蚕捉,常見的返回表的情況包括:
- 直接返回表本身奏篙,如:
EVALUATE Product
- 返回被過濾的表,如:
EVALUATE
FILTER ( 'Product', 'Product'[Color] = "red" )
- 返回CACULATETABLE計算后的表迫淹,如:
EVALUATE
CALCULATETABLE (
DISTINCT ( 'Product'[Product Name] ),
'Product Category'[Category] = "audio"
)
- ALL和VALUES也是返回表的函數秘通,在DAX Studio中可以很好的看到它們的特性敛熬,如:
EVALUATE
ALL('Product Category'[Category])
EVALUATE
VALUES('Product Category'[Category])
結果如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-28-48.jpg)
注意:DAX Studio 2.6 開始支持返回多結果,也就是一次性寫多個EVALUATE進行計算话原。
另外一個結果是:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-30-55.jpg)
發(fā)現了嗎?ALL和VALUES在這種情況下返回的結果是一樣的诲锹。你還可以自行實驗有 重復值 列的情況繁仁。
流暢的代碼編寫體驗
之所以說當你熟悉了DAX的感覺后會不能再沒有她,正是因為她能幫助你流暢地編寫DAX代碼归园。這表現在:
- DAX 函數及模型元數據智能感知黄虱,如:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-37-07.jpg)
DAX Studio 可以自動識別當前DAX引擎可用的DAX函數以及當前模型的元數據(表及列)并迅速進行提示,這使得編寫代碼的速度很快庸诱。
- DAX 代碼著色及格式化
DAX Studio 使用DAXFormatter.com對代碼進行格式化捻浦,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-42-19.jpg)
點擊:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-42-37.jpg)
得到:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-43-02.jpg)
在編寫復雜的 DAX 查詢 時,代碼著色以及括號匹配能幫助我們避免很多錯誤桥爽。
- 語法檢測及錯誤提醒
如果你的代碼出現錯誤朱灿,DAX Studio可以進行語法檢查并幫助排除錯誤。例如在上述的DAX查詢中钠四,對[Category Code]
不小寫多寫了一個空格成為[Category Code ]
盗扒,這也是不允許的,DAX Studio會報錯形导,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-02-47-23.jpg)
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]
)
可以看出在上述過程中,并沒有刪除每一步的代碼栅贴,而總是利用每一次的代碼繼續(xù)下一步斟湃。并得到結果:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-15-26.jpg)
可以發(fā)現,有的類別層級組合是沒有銷售額的檐薯,不希望顯示這樣的結果凝赛,于是可以進一步用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] <> ""
)
結果為:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-20-59.jpg)
這已經很完美墓猎。
尤其是在編寫復雜的 DAX 查詢 時,可以采用逐步測試的方法并配合注釋使得DAX代碼可以被長期維護赚楚。
使用DAX Studio理解模型中的元數據
DAX Studio可以幫助分析師了解模型的元數據毙沾,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-24-25.jpg)
包括Power BI Desktop自動生成的代碼左胞,例如:Power BI Desktop會自動為每個日期列添加一個適用于時間智能的隱藏日期表烤宙。這個隱藏的日期表在Power BI Desktop默認是看不到的俭嘁,但是在DAX Studio中卻一覽無遺兄淫。
如果禁用Power BI Desktop自動生成日期表的功能捕虽,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-27-50.png)
此時回到DAX Studio中查看模型的元數據將不再存在隱藏的日期表泄私,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-28-51.jpg)
使用DAX Studio理解所有DAX函數
DAX Studio可以讀取DAX引擎支持的所有函數晌端,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-30-07.jpg)
這可以幫助分析師快速了解所有的DAX函數咧纠,包括DAX引擎更新后可能新加入的函數泻骤。
使用DAX Studio初步理解DMV并使用Power BI Desktop作為分析服務
Analysis Services Dynamic Management Views (DMV)梧奢,即:分析服務的動態(tài)管理視圖亲轨,它提供了對當前運行的分析服務動態(tài)信息進行查詢的接口惦蚊。如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-39-29.jpg)
由于Excel Power Pivot蹦锋,Power BI Desktop以及SSAS均使用分析服務引擎端姚,所以都具備這個DMV。通過查詢DMV巫湘,用戶可以知道由于當前分析服務的幾乎所有信息尚氛,這為基于Power BI Desktop的高級應用提供了基礎阅嘶。
例如:DMV透露了作為當前分析服務的實例载迄,那便可以使用該實例作為服務器护昧。將Excel作為客戶端惋耙,與之進行連接。
這里顯示了端口號:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-49-55.jpg)
用Excel作為客戶端工具與之連接湿酸,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-54-36.jpg)
輸入剛剛在DAX Studio中得到的連接信息推溃,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-55-43.jpg)
Excel提示可以與當前的分析服務連接美莫,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-57-13.jpg)
此時,在Power BI Desktop定義的模型便可以直接在Excel中使用了窝撵,如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-03-59-22.jpg)
至此碌奉,Excel與Power BI Desktop完全連接起來赐劣,不需要在Excel中建立數據模型一樣可以直接對數據模型加以利用哩都。
有關DMV的深度利用漠嵌,超出了本文范圍儒鹿,后續(xù)再做描述。
使用DAX Studio輸出DAX查詢
這又是一項DAX Studio非常出彩的功能植阴。我們知道在Excel中單表限制是100W行數據掠手;而在Power BI Desktop中又無法導出數據狸捕。這就存在一個問題,那就是:是否可能將加載進數據模型(Excel 數據模型或Power BI Desktop數據模型)的大數據量級事實表(如:超過1000W行)導出?
對于分析師而言株搔,這是一個非常重要的功能纯蛾。這項功能也是由DAX Studio提供的翻诉。
在示例PBI文件中便使用了多達1200W行的銷售數據,如下:
EVALUATE
ROW ( "rows of sales", COUNTROWS ( Sales ) )
結果:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-08-21.jpg)
這甚至不能只能在DAX Studio的輸出視圖中顯示舒岸,這有可能導致內存不足。但可以通過DAX Studio把輸出目標改為文件俄认,這樣就像在內存數據模型與硬盤目標文件之間建立了管道眯杏,數據像流水一樣岂贩,順暢地流入目標文件萎津。
在DAX Studio設置輸出目標為:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-11-22.jpg)
執(zhí)行這項“危險”的操作如下:
EVALUATE
Sales
執(zhí)行查詢姜性,并設置保存的文件格式為CSV格式:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-14-36.jpg)
DAX Studio大致以每秒15000行的速度導出數據:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-15-35.jpg)
如果此時觀察任務管理器部念,可以看到:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-16-51.jpg)
DAX Studio進程以全速工作儡炼,并以1.5~2M/S每秒的速度與磁盤交互乌询,在它身邊正是Power BI Desktop啟動的本地分析服務妹田。
導出結果如下:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-40-14.jpg)
文件大小為2G鹃共。Power BI Desktop源文件(包含Sales在內所有模型表)整個大小為300M霜浴。DAX引擎的壓縮能力在此也可見一斑。
分析師電腦配置在硬盤方面使用固態(tài)硬盤便是為此處考慮晌纫。增加硬盤的讀寫速度箭养,對于大數據量級數據讀寫有明顯優(yōu)勢露懒。
總結
至此懈词,現在我們已經可以基本駕駛DAX Studio完成大多數DAX查詢相關工作坎弯,包括:
- 流暢地編寫DAX查詢抠忘。
- 使用DAX Studio實現逐步編寫DAX查詢崎脉。
- 使用DAX Studio學習理解所有DAX函數。
- 使用DAX Studio理解模型的元數據祭衩。
- 初步使用DAX Studio理解DMV掐暮。
- 使用DAX Studio導出DAX查詢路克。
如果說現在已經可以通過DAX Studio暢快地駕駛DAX查詢精算,那還有最后一個階段殖妇,那就是:透徹地理解DAX引擎谦趣,完成修車前鹅,彎道急速超車等高難度動作舰绘。
推薦<<極品飛車>>這一電影蹂喻,其中一個片段是:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-33-04.jpg)
有好車,不一定人人能開出極速捂寿。所有的分析師都可以使用Power BI Desktop口四,但真正的高手是能開出極速的。
其中還有一個片段:
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-36-10.jpg)
夢想秦陋,比工作更重要蔓彩。
這兩個片段,你找到了嗎驳概?
對于如何像電影的感覺一般與DAX查詢?yōu)槲閷⒃诘谌轮欣^續(xù)探索赤嚼。
如果你對本文感興趣,歡迎分享到你的朋友圈顺又。
后臺留言便可獲取示例文件更卒。
![](http://files.excel120.com/MD/Excel120/DAX Studio/_image/2017-06-06-04-31-12.jpg)