BI開發之——Mdx基礎語法(1)


 

Mdx為MultiDimensional  Expressions的縮寫,多維表達式,是標准的OLAP查詢語言。在多數OLAPServer都提供Mdx支持,如Microsoft Sql Server OLAP Services,SAS,Hyperion Essbase等。支持多維對象於數據定義和操作。Mdx很多方面與結構化查詢語言(SQL)語法相似,但他不是SQL語言的擴展;事實上,Mdx所提供的一些功能也可由SQL提供,盡管不是那么有效或直觀。

  如同SQL查詢一樣,每個Mdx查詢都要求有數據請求(select子句)、起始點(From子句)和篩選(where子句)。這些關鍵字以及其它關鍵字提供了各種工具,用來從多維數據集析取數據的特定部分。Mdx還提供了可靠的函數集,用來檢索的數據進行操作,同時還具有用戶定義函數擴展Mdx的能力。

Mdx為多維數據庫提供了表達式語查詢語法,用於cube數據,並提供了許多強大的分析函數,用於支持常用的OLAP分析。

語法

 維度、級別、成員等,一般用唯一名稱UniqueName來標示,可以用[]包圍name,如果name有空格或者數字開頭,必須使用[],否則可以忽略。UniqueName是根據層次結構表示的一種方法。即遞歸顯示出祖先的名稱。

維度(Dimension):維度直接用[]包圍。比如Product的唯一名稱為[Product]或Product。

級別(Level):級別的UniqueName為[維度名稱].[級別名稱],如[year].[2001],同樣,如果沒有空格,[]可以省略,如year.[2001]。

成員(Member):成員的UniqueName格式為[維度].(Parent  Member  UniqueName).[Member Name],如:時間維上的2003年2月份的UniqueName為[2003].[1].[2],中間的1為1季度,因為該維度的結構為年、季、月。

度量(Measure):度量實際上市屬於維度維的成員,也就是說度量(Measure)是任何Cube的一個維度。如:度量Unit Sales的UnqiueName為[Measures].[Unit Sales]

 UniqueName是OLAP元素內部的表示法,在Mdx查詢語言中,可以使用UniqueName來表示元素。

Mdx還提供模糊和其他等價的元素的表示方式:

<1>省略維度名表示級別,如果一個維度的級別名在整個Cube中是唯一的,那么可以省略維度名來查詢級別。如Product.[Product Family]可以寫成[Product Family]

<2>省略維度名稱表示成員。如果省略維度名,可以標示該維度最高級別的成員,如[Time].[2000]可以寫成[2000],[Measures].[Unit Sales]可以寫成[Unit Sales]。

<3>成員掛在級別下,即成員不一定要寫成[維度].(Parent  Member  UniqueName).[Member Name],可以寫成[維度].[級別].[Member Name],如2000年3月可以寫成[Time].[Months].[3]

模糊查詢表示法,都基於不會重復的假設,如果有重復的元素,取第一個查找的元素作為查詢結果,可能發生錯誤,因此,建議使用完備的表示法

 元組、集合

  元組用於定義來自多維數據切片;他是由一個或多個維度的單個成員的有序集合組成。元組內不包含來自同一個維度的多個成員(可以理解為坐標),元組用()包圍。

如:

(時間.[下半年])

(時間.[下半年],[產品].[手機].[Nokia])

如果一個元組是由單個維度的成員組成,那么可以不用()包圍,即(時間.[下半年])可表示為:時間.[下半年]

集合(Set)是零個、一個或多個元組的有序集合。集合最常用於在Mdx查詢中定義軸維度和切片器維度,並且同樣可能只具有單個元組或可能在某些情況下為空。在Mdx語法中,元組用花括號{}來構造集合

舉例,下面是具有兩個元組的集合:

{(時間.[上半年],路線.非陸地.航空),(時間.[下半年],路線.非陸地.海路)}

一個集合可包含同一個元組不止一次的出現。這樣也是可以的:

{時間.[下半年],時間.[下半年]}

集合值以元組表示的一組成員組合,或指集合中的元組所代表的單元中的值,視集合使用的上下文而定。

注意:單個元組的集合不等於元組。如{時間.[下半年]}不等於  時間.[下半年]。

在Mdx語法中,很多函數語義中包含元組和集合,作為參數或者返回值。

Mdx基本語法結構

  先看看Mdx基本語法結構:

   SELECT  [axis specification] ON COLUMNS,

                [axis specification] ON ROWS

   FROM

                [cube name]

   WHERE

              [silcer specification]

1、[axis specification]可以看成是軸的成員選擇。

2、[silcer specification]表示切片上的成員,可以看成過濾信息,[silcer specification]可選,如果沒有指定,取系統默認的維度成員作為切片

 

軸維度和切片器維度

當設計多維表達式(Mdx)查詢時,應用程序一般查看多維數據集並將維度集合划分為兩個子集:

1、軸維度,為多個成員檢索數據的維度

2、切片器維度,為單個成員檢索數據的維度。

因為軸維度和切片器維度都從要查詢的多維數據集的多個維度構造,所以用這些術語將要查詢的多維數據集使用的維度與在由Mdx查詢返回的多維數據集中創建的維度區分開。

例如:

假定存在名為TestCube的多維數據集,具有兩個名為Route和Time的簡單維度。因為多維數據集的度量值是Measures維度的一部分,所以該多維數據集總共有三個維度。查詢要提供一個矩陣,可以在該矩陣內跨路線和時間比較Packages度量值

在下面的Mdx查詢實例中,Route和Time維度用作軸維度,Measures維度用作切片器維度。Members函數表明要用於構造集合的維度或級別的成員,而不必再Mdx查詢中顯示聲明給定維度或級別的各個成員。

SELECT

  {Route.nonground.Members} ON COLUMNS

  {Time.[1st half].Members} ON ROWS

FROM

  TestCube

WHERE  ([Mesures].[Packages])

指定維度的內容:

軸維度決定多維結果結果集的邊緣。多維表達式(Mdx)使用Select子句通過將集合指派到特定軸來指定軸維度。

在下面的語法示例中,每個<axis_specification>值定義一個軸維度。數據集中軸的個數等於多維表達式(Mdx)查詢中<axis_specification>值的個數。Mdx查詢最多可以支持128個指定軸,但幾乎沒有Mdx查詢會用到5個以上的軸。

<axis_specification>語法可分解為:

<axis_specification>::=<set> ON <axis_name>

<axis_name>::=COLUMNS|ROWS

軸維度上的只能接受集合<set>,如果是手動指定成員集合,必須用{}包圍,如果使用Mdx集合函數,則不需要用{}包圍,因為集合函數返回值為集合。一個軸維度上可以包含幾個維度,如:

SELECT

     {

          [Measures].[Sales_Dollars], [Measures].[Sales_Units],

          [Measures].[Sales_Units_max]

     }

ON

   columns,

     CrossJoin(

                      {

                             [State].[Canada], [State].[Mexico], [State].[USA]

                      },

                     {

                              [Product].[Bread], [Product].[Dairy], [Product].[Meat]

                      }

               ) ON rows

 FROM

     sales

 WHERE

      ([Time].[All Time], [Employee].[All Employee])

 Columns軸上是手工指定成員元組集合,用{}包圍,Rows軸使用集合函數CrossJoin,該函數返回兩個集合的交集,Rows軸上包含兩個維度State和Product。

指定切片器維度的內容

切片器維度篩選器多維數據,可以通過將切片器維度包含在多維表達式(Mdx)查詢的Where子句來限制所返回的數據。

假定未顯示指派給軸的維度是切片器維度,並用其默認成員進行篩選。則默認成員為最高級別的的第一個成員。

切片器維度還可通過Mdx語法的Where子句進行顯示指定。Where子句的語法可分解為:

[WHERE  [<silcer_specification>]]

切片器維度只可接受評估為單個元組的表示式。如下例所示:

WHERE  ([Time].[1st half],[Route].[nonground]) 

 


免責聲明!

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



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