[譯]MDX 介紹


關於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)的工業標准稱呼. SSAS Cube Example

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: 層級是維度屬性的分級結構.層級結構包含多個級別,每個級別又包含多個成員 .下圖中是一個層級的圖釋. 你可以很清楚的看到成員,級別,和層級的構成.

SSAS 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查詢語句. 讓我們解析一下這個查詢的各個部分.

Basic MDX Query example

一看到這個查詢,你可能覺得很像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.

Open MDX Query window

現在MDX 查詢編輯器窗口已經打開.我們開始寫點MDX, 第一個查詢非常簡單, 它返回Adventure Works cube默認的度量.

SELECT
FROM [ADVENTURE WORKS]
;

結果:

query results

如果你執行了上面的查詢,結果只返回了一個數字. 默認情況下什么都沒指定那么就返回Cube中默認的度量. 在Adventure Works cube中. 默認的是度量是  Reseller Sales Amount. 這個查詢返回了 所有產品,所有時間,所有區域…等等等 ..總之就是Reseller Sales 總和 . 所以除非你指定某個要看的度量.否則就返回默認的度量 Reseller Sales Amount.

如果我要看不懂的度量,那就必須使用Where語句指定一個切片(slicer).

SELECT
FROM [ADVENTURE WORKS]
WHERE [Measures].[Reseller Total Product Cost]
;

結果:

Basic Query with slicer

因為我們限定了查詢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]
;

結果:

Basic Query with dimensions on two axes

我們在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]
;

結果:

Basic MDX query with dimensions and slicer

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM