關於MDX
MDX (Multi Dimensional eXpression language) 是非常強大的工具,可以將你的多維數據庫/cube 發揮到極致. 本文會覆蓋MDX基礎,並且希望能使你對MDX查詢語法,MDX的強大原因,以及如何在你的B.I. 方案中使用MDX進行計算 有充分的認識 .
就 MSDN 上的定義, MDX的目的就是為了訪問多維數據更方便 . 用MDX來查看各種類別(tegories)和聚合(aggregated)的數據再合適不過. 你可能會有這樣的疑問,”為什么不直接寫個SQL存儲過程來查詢數據倉庫? 我可以從cube獲得的數據同樣也可以從數據倉庫獲得!”. 雖然這是實話,但你想一下,你手上有個報表需求,需要計算實際銷售(Actual Sales),銷售目標(Sales Goals) 以及銷售周期(Prior Period Sales). 然后以銷售區域(Sales Region), 銷售單位(Stores), 年月進行分組. 編寫一個存儲過程從數據倉庫抽取需要的數據,數據量會很大而且散亂,甚至數據倉庫沒有針對聚合數據報表優化的話,存儲的執行效率也會非常地下. 而cube存儲的是數據聚合后的結果, MDX查通過多個維度查詢聚合(比如區域,銷售單位,月份,等)數據要快速高效很多. 簡而言之,MDX可以讓你用很少的代碼來構建及其復雜的查詢和報表.不僅僅是查詢和報表更容易的創建,他們的執行速度也比直接用SQL查詢塊的多.
接下來,讓我們先回顧下一些術語,在我們編寫第一個MDX查詢之前必須了解他們.
Basic Terms:
Cube: 一個cube是建立在表格和視圖的度量(measures), 事實(facts), 還有維度( dimensions)的集合, 通常來自一個數據倉庫. 在一個Cube中,幾乎存儲了每一個度量的聚合和維度組合. 比如在一個cube中銷量是一個度量,你肯能隨時想通過產品來查看銷量數據. 每產品的銷售聚合早已存儲在Cube中.這就是基於cube的MDX查詢要比直接在數據庫中用SQL查詢塊的多的原因. 在下圖中, 你看到一個用圖形化表示的含有多個軸的cube,包含Time, Product, 還有 Store 維度.注意 Analysis Services cube指的不是一個立方體. 術語cube 是多維數據庫(multidimensional database)的工業標准稱呼.
Dimension: 維度就是把某一類(角度)的相關數據組織在一起.比如Adventure Works cube有個產品維度 .一個維度可以建立在表格,視圖,或者涉及多個表格或視圖的SELECT 語句.
Attribute: 屬性可以理解為一個維度性質的描述.例如Product維度的一些屬性為種類(Category),型號名( Model Name), 產品(Product), 還有款式(Style) (這里只是舉些例子).
Measures (Facts): 度量或事實,表示可以被聚合的量化數據. Adventure Works 里面的 Reseller Sales 度量組 就包含 Reseller Tax Amount, Reseller Freight Amount, 和 Reseller Order Quantity 度量.這些度量可以通過cube中的維度進行聚合計算. 例如 把銷量划分(broken down )為 產品,區域,時間來查看,對終端用戶來說可能更有價值. 而度量就可以按照這種方式查看.
Hierarchy: 層級是維度屬性的分級結構.層級結構包含多個級別,每個級別又包含多個成員 .下圖中是一個層級的圖釋. 你可以很清楚的看到成員,級別,和層級的構成.
Level: 正如上面提到的,一個層級包含多個級別. 在 Adventure Works cube 中 Fiscal Year 層級由四個級別組成: 最上面的級別是Year,第二個是Quarter, 第三個是Semester, 第四個是 Month, 最后一個級別是 Date.
Member: 成員是級別中的一個值. 比如Adventure Words cube 中的 Fiscal Year 層級的 Month 級別中的成員 March 就是一個值.
Axis: 可以把軸視為維度的一個線性衍生. 軸和維度交錯於cube和度量.
MDX查詢最多支持128軸. 單只有5個有別名.
- Rows
- Columns
- Pages
- Chapters
- Sections
多數 MDX 查詢只包含 2 個軸就能把報表搞定了. 另外能一次查看超過2個維度的多維數據庫軟件並不多.
Tuple: 元組是使用不同維度屬性來標示唯一單元的有序組合(A tuple is an ordered collection of dimension attributes that are not from the same dimension that uniquely identify a cell in a cube .這句吃不太准意思..怕有誤解所以原文貼上). 在下面的列子中 , 小括號里面的就是元組,由 Data維度的Fiscal Year屬性與Sales Reason維度的Sales Reason 屬性組合 .
--A tuple ([Date].[Fiscal Year].&[2006], [Sales Reason].[Sales Reason].&[9])
Set: 集合是元組的聚集. 下列集合包含兩個元組. 一個集合中的元組的維度必須一致,否則你的查詢會報錯.就是說,維度必須一樣,順序也必須一樣. 集合必須用花括號框起來. 其中的每個元組用小括號框起來.
--A collection of tuples { ([Date].[Fiscal Year].&[2006], [Sales Reason].[Sales Reason].&[9]), ([Date].[Fiscal Year].&[2006], [Sales Reason].[Sales Reason].&[5]) }
MDX Query Syntax
下圖是一條基礎的MDX查詢語句. 讓我們解析一下這個查詢的各個部分.
一看到這個查詢,你可能覺得很像T-SQL , 不過那也只是部分相似而已.MDX查詢語句的功能與T-SQL有很大差異.
首先是 SELECT 語句. MDX查詢中的 Select 語句與SQL 查詢的SELECT語句有很大差別. 在T-SQL中, SELECT 語句只能定義查詢結果的列布局. 在MDX中SELECT 語句定義多個維度,共達128個不同的軸. 上面的示例中,你可以看到我們指定了日期維度和Fiscal Year 屬性,並顯示在橫(Row)軸上. Internet Order Quanity 度量顯示在縱(Column)上.
接着是FROM 語句. FROM 語句指定你要查詢的cube. 在 T-SQL中你可以通過FROM 語句連接多個表格,但是MDX沒法連接多個cube. 所以想都不要想了.
最后是WHERE 語句. WHERE語句指定一個切片(slicer dimension ) 限制MDX 查詢的結果. 例子中我們用了 Product維度Category屬性中的一個成員(實際值是Bikes category ) 來限制查詢結果.
建立基本的查詢
我們一些學了一些必要的屬於,並且了解了基本的查詢語法. 現在,讓我們開始寫一些MDX.
Important Note: 本例中所有示例使用的都是 Adventure Works 2008 Analysis Services database, 可以從這里下載here. 裝好以后,用BIDS打開Analysis Services 項目(默認地址default in c:\Program Files\Microsoft SQL Server\100\Tools\Samples) . 記得修改數據源連接,然后部署項目.
打開 SQL Server Management Studio. 在彈出的 Connect to Server 對話框中,下拉選擇Analysis Services.指定Adventure Works 數據庫所在的服務器.
連接后右擊 AdventureWorksCube 選擇 New Query 然后選 MDX.
現在MDX 查詢編輯器窗口已經打開.我們開始寫點MDX, 第一個查詢非常簡單, 它返回Adventure Works cube默認的度量.
SELECT FROM [ADVENTURE WORKS] ;
結果:
如果你執行了上面的查詢,結果只返回了一個數字. 默認情況下什么都沒指定那么就返回Cube中默認的度量. 在Adventure Works cube中. 默認的是度量是 Reseller Sales Amount. 這個查詢返回了 所有產品,所有時間,所有區域…等等等 ..總之就是Reseller Sales 總和 . 所以除非你指定某個要看的度量.否則就返回默認的度量 Reseller Sales Amount.
如果我要看不懂的度量,那就必須使用Where語句指定一個切片(slicer).
SELECT FROM [ADVENTURE WORKS] WHERE [Measures].[Reseller Total Product Cost] ;
結果:
因為我們限定了查詢Where語句的查詢范圍 Reseller Total Product Cost, 所以查詢返回Reseller Total Product Cost的總計.
現在讓我們指定一些維度,對cube進行切片和分塊.
SELECT [Date].[Calendar].[Calendar Year] ON COLUMNS, [Product].[Product Categories].[Category] ON ROWS FROM [ADVENTURE WORKS] ;
結果:
我們在Columns軸和Row軸上都指定了維度. 因為我們沒有指定返回的度量,所以默認還是返回Reseller Sales Amount.
最后一個查詢,讓我們把所有東西都放上去:
SELECT [Date].[Calendar].[Calendar Year] ON COLUMNS, [Product].[Product Categories].[Category] ON ROWS FROM [ADVENTURE WORKS] WHERE [Measures].[Reseller Total Product Cost] ;
結果:
MDX 書籍
這里有一些值得推薦的MDX書:
MDX Solutions - http://www.amazon.com/MDX-Solutions-Microsoft-Analysis-Services/dp/0471748080/ref=sr_1_2?ie=UTF8&s=books&qid=1284385194&sr=8-2
Microsoft SQL Server 2008 MDX Step by Step - http://www.amazon.com/Microsoft-SQL-Server-2008-Step/dp/0735626189/ref=sr_1_1?s=books&ie=UTF8&qid=1284385251&sr=1-1
Practical MDX Queries - http://www.amazon.com/Practical-MDX-Queries-Microsoft-Analysis/dp/0071713360/ref=sr_1_1?s=books&ie=UTF8&qid=1284385281&sr=1-1
Fast Track to MDX - http://www.amazon.com/Fast-Track-MDX-Mark-Whitehorn/dp/1846281741/ref=sr_1_1?ie=UTF8&s=books&qid=1284477262&sr=8-1
I hope this article has given you a good starting point so that you can begin writing your own MDX queries. Stay on the look out for my part 2 article in which we will cover more advanced MDX functions and queries. As always, feel free to shoot me a message, leave a comment, or email me at dryan@pragmaticworks.com .
原文地址: http://www.bidn.com/articles/mdx-and-dmx/178/mdx-101-introduction-to-mdx