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])
