MDX語句

MDX語句

MDX語句MultiDimensionalExpressions是一種語言,支持多維對象與數據的定義和操作。它可以表達線上分析出來數據卡上的選擇、計算和一些元數據定義等操作,並賦予用戶表現查詢結果的能力

基本介紹

  • 中文名:MDX語句
  • 外文名:MultiDimensionaleXpressions
  • 領域:計算機
  • 公司:Microsoft,Hyperion等公司
MDX學習教程
一、什麼是MDX
MDX是由Microsoft,Hyperion等公司研究多維查詢表達式,是所有OLAP高級分析所採用的核心查詢語言。
如同SQL查詢一樣,每個MDX 查詢都要求有數據請求(SELECT子句)、起始點(FROM子句)和篩選(WHERE子句)。這些關鍵字以及其它關鍵字提供了各種工具,用來從多維數據集析取數據特定部分。MDX還提供了可靠的函式集,用來對所檢索的數據進行操作,同時還具有用戶定義函式擴展 MDX的能力。
二、 MDX的使用方式
1MDX查詢語句
查詢所需要的數據。
2MDX表達式
定製需要的指標。
3MDX腳本
指定流程由SQL執行生成自定義的效果。
三、MDX中的相關概念
1、多維數據集
2、度量值(量度
3、維度
4、維度的層次結構
5、維度的級別
6、成員(Member
指的是維度樹上的一個節點,這裡有一點需要指出,量度也是一個特殊的維度,所以對於普通維度上的 Member可以有幾下幾種表示方法: [Customer] 或 [Time].[1996] 等,對於特殊的維度——量度而言,也可以表示一個 Member,如: [Measures].[unitsales] 等。
標識符:[ ]
7、元組(Tuple
是由若干個Members組成,CUBE上的一個子集(不斷開的子CUBE),每一個維度上最多只能有一個 Member,對於一個 Tuple而言至少有一個維度,多則不限,順序無關,同時對於沒有列出來的那就表示為默認的 Member。
標識符:()
示例:
a) ([Regin ].[USA])
b) ([product].[computers],[time].[2008]) 。
8、集(Set
同一維度上若干個 Members的集合,或者是若干個 Tuples的集合,但這裡有一個地方需要注意,那就是如果是若干個 Tuple組成的集合是,各個 Tuple里的 Member之間存在著一定的對應關係。集合的表示方法用大括弧“ {} ”,所以可能的表示方法為:
a) {[time].[2008],[time].[2009],[time].[2000]} ,這裡 Set是由 同一維度的若干個 Member組成。
b) {([computer],[usa ]),([mobile],[china])} ,這個 Set是由兩個 Tuples組成,這裡大家可以看到,在第一個 Tuple當中,第一個 Member是名為 computer的產品,所以後面的 Tuple的第一個 Member也必須是一個產品,所以我們這裡看到的是 mobile,第一個 Tuple里第二個 Member是一個國家,所以第二個 Tuple的第二個 Member也必須是一個國家名,依次類推。
標識符:{ }
四、 基本語法
一個標準的 MDX查詢語句就是由我們前面介紹的 MDX的三個基本對象構成,也就是 Member、 Tuple、 Set。
1、SELECT SET ON COLUMNS,
SET ON ROWS
FROM CUBE
WHERE TUPLE
2、SELECT SET ON 0,
SET ON 1
FROM CUBE
WHERE TUPLE
五、簡單MDX查詢示例
想像一個簡單的帶有時間、銷售地點和度量3個維度的多維數據集,該多維數據集的名稱為銷售額(即SALES)。其中度量包括銷售額和成本。假如想查看2005年前兩個季度麻薩諸塞州的銷售額與成本,如圖所示。
我們可以通過下面的MDX獲得想要的數據:
SELECT {[MEASURES].[DOLLAR SALES],[MEASURES].[UNIT SALES]} ON COLUMNS,
{[TIME].[2005].[Q1], [TIME].[2005].[Q2]} ON ROWS
FROM [SALES]
WHERE ([CUSTOMER].[MA])
MDX查詢的結果本身是一個格線,本質上是另一個多維數據集。下面將這個簡單的查詢拆開來仔細研究。
關鍵字SELECT後帶需要檢索內容的子句。
關鍵字ON和軸的名稱一起使用,以指定資料庫的維度顯示位置。該示例查詢將度量顯示為列,將時間段顯示為行。
MDX用大括弧{ }引用來自某個特點維度或者多個維度的一組元素。這個簡單的查詢在其兩個軸中的每一個上都只有一個維度(度量維度和時間維度)。元素間用逗號隔開。元素名稱用方括弧引用,並且不同組成部分之間用點號分隔。
MDX能夠的FROM子句指明用於查詢數據的多維數據集。這與SQL中的FROM子句類似。
WHERE子句指定在列或行(或者其他軸上)不出現的多維數據集其他維度的成員。如果不對某個維度指定一個成員,MDX將使用默認成員。WHERE子句是可選的。
提示:MDX不是大小寫敏感的,可以隨心所欲的混用字母大小寫。
六、MDX中的簡單函式和操作符
1、逗號(,)與冒號(:)
可以通過枚舉元素並用逗號來隔開構造一個集,例如上面示例中用到的例子。
{[TIME].[2005].[Q1], [TIME].[2005].[Q2]}
該表達式產生一個包含2005年第一季度和第二季度的集。
冒號用同一級別的兩個成員作為端點,來表示這兩個端點間的所有成員(與EXCEL中的指定單元格範圍的用法類似)。在冒號兩邊可以是相同的成員,表示集中只有一個成員。例如:
{[TIME].[2005].[SEP]: [TIME].[2006].[MAR]}
該表達式表示從2005年9月到2006年3月的所有月份。
2、.MEMBERS 獲取所有成員
無論用於檢索,還是作為更複雜的操作的基礎,獲得一個維度、層次結構或者級別的成員的集是非常普遍的操作。維度、層次結構或者級別放置在.MEMBERS操作符的左邊,可以返回由該元數據範圍內所有成員構成的集。
例如:
[TIME].[MONTHS].MEMBERS
該表達式返回時間維度下的月這一級別的所有成員(即所有月份)。
4、.PREMEMBER獲取指定成員的前一個成員
5、.NEXTMEMBER獲取指定成員的後一個成員
6、使用.CHILDREN獲得一個成員的子成員
另外一個常用的查詢時獲得一個成員的子成員。這么做的目的可能是執行一個向下鑽的操作,或者為了方便的獲得基於一個共同父成員的範圍內的成員。例如:
[TIME].[YEARS].[2005].CHILDREN
該表達式返回2005年的所有孩子(即2005年的所有月份)。
7、.FIRSTCHILD 獲取指定成員的第一個子成員
8、.LASTCHILD獲取指定成員的最後一個子成員
七、更多基本辭彙
1DESCENDANTS() 獲取一個成員的後代成員。
直接子代之下的後代成員,可以使用DESCENDANTS()。
語法:
DESCENDANTS(MEMBER,LEVEL,FALG)
返回MEMBER之下與LEVEL相關的成員,並且可選參數FLAG。
FLAG的可選值有:
SELF
BEFORE
AFTER
SELF_AND_BEFORE
SELF_AND_ AFTER
SELF_ BEFORE _BEFORE
LEAVES
SELF僅僅指MEMBER以下LEVEL級別上的成員,這是最常用的選項,如果忽略FLAG參數,那么默認使用SELF。例如:
DESCENDANTS([TIME].[YEARS].[2005],[TIME].[MONTH])
該將返回2005年的所有月份。
SELF_AND_BEFORE將返回MEMBER所在級別已經LEVEL級別之間的所有成員,也就是包含MEMBER在內、從LEVEL級別到MEMBER級別的所有成員。例如:
DESCENDANTS([TIME].[YEARS].[2005],[TIME].[MONTHS],
SELF_AND_BEFORE)
該表達式將返回2005年及該年的所有季度和所有月份。
2FILTER() 過濾
FILTER()函式用來縮減集(過濾),它表示在結果集中只包含那些符合特定標準的元素。FILTER()採用一個集和一個布爾表達式作為它的參數,並且當布爾表達式為真時,返回該集的子集。
語法:
FILTER(SET,BOOLEAN-EXPRESSION)
例如:
FILTER({[PRODUCT].[PRODUCTCATEGORY].MEMBERS},
[MEASURES].[DOLLARSALES]>=500)
該表達式將返回相關美元銷售額在500元以上的某類產品構成的集。
FILTER()可以操作元組構成的任何集,而不僅僅是以個維度的成員構成的集。
3ORDER() 排序
ORDER()用來根據相關數據值給集的元組排序。
語法:
ORDER (SET,EXPRESSION,FLAG)
ORDER()的參數包括一個集、排序標準,還有一個可選的標誌,該標誌指示排序原則(升序或降序,包含或者忽略元組間的層次關係)。ORDER()返回的集由原來的集的元組構成,但按照新指定的順序重新排序。
例如:
ORDER([PRODUCT].[PRODUCTCATEGORY].MEMBERS},
[MEASURES].[DOLLARSALES],BDESC)
該表達式將按銷售額對產品進行降序排序(BDESC將忽略層次結構)。
4、.CURRENTMEMBER 獲取當前成員
語法:
DIMENSION.CURRENTMEMBER
返回該維度的當前成員。
5、.PARENT 獲取指定成員的父對象成員
語法:
MEMBER.PARENT
返回對給定成員的父對象成員。
6NONEMPTY去除空切片
在一個多維空間中,數據稀疏現象很常見。MDX中提供了從查詢的結果中移除完全為空的切片的方法,那就是使用NONEMPTY關鍵字。去除空切片需要做的僅僅是在待移除空切片的軸前面加上NONEMPTY關鍵字。NONEMPTY可以用在任何軸、維度和元組上。
7、去年同期的引用和計算
一個經常會用到的計算是查詢一年前同一時期的數據,或者上一個季度同一時期和上周同一天的數據。可以使用PARALLELPERIOD()函式。
語法:
PARALLELPERIOD(LEVEL,INDEX,MEMBER)
該函式首先的到級別LEVEL中成員MEMBER的主席,然後從該祖先的兄弟成員中找到編號比該祖先小INDEX的成員(稱為姻親),最後返回該姻親的後代成員中MEMBER的堂兄弟。
例如:
PARALLELPERIOD([YEARS],1,[MAY2006])
將返回[MAY2005]

相關詞條

熱門詞條

聯絡我們