MDX入門實(shí)例參考_第1頁
MDX入門實(shí)例參考_第2頁
MDX入門實(shí)例參考_第3頁
MDX入門實(shí)例參考_第4頁
MDX入門實(shí)例參考_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在關(guān)系數(shù)據(jù)庫中使用SQL語言來查詢、管理和操作數(shù)據(jù)庫中的數(shù)據(jù)。在SQLServer中使用MDX語句來進(jìn)行多維數(shù)據(jù)庫的操作和管理,MDX不但可以用在SSAS中進(jìn)行多維數(shù)據(jù)庫的查詢管理,也可使用在SSIS和SSRS中分別輔助處理ETL過程和報(bào)表開發(fā)過程。因?yàn)镸DX語句沒有標(biāo)準(zhǔn)化,不同的BI解決方案提供使用不同的多維數(shù)據(jù)查詢技術(shù),所以SQLServer中的MDX語言只能在SQLServer中使用,如果要進(jìn)行其它數(shù)據(jù)庫如ORACLE,Hyperion的查詢,就要了解與其相對應(yīng)的MDX,可能在語法或一些用法上不同于SQLServer中的MDX。本文針對的是SQLServer中的MDX。本文以一個(gè)簡單的MDX查詢開始,分別解析這個(gè)查詢的各個(gè)部分,以此來學(xué)習(xí)MDX語法。但是在這之前首先要介紹使用的案例多維數(shù)據(jù)集。一.案例所使用的多維數(shù)據(jù)集維度:

圖一:維度信息度量值:

圖二:度量信息

其中MaxUnitsOrdered和TotalUnitsOrdered兩個(gè)度量是導(dǎo)出度量,即通過命名計(jì)算得到的度量。維度結(jié)構(gòu):

圖三:Product維度結(jié)構(gòu)

圖四:Store維度結(jié)構(gòu)

圖五:TimeByDay維度結(jié)構(gòu),即時(shí)間維度

圖六:多維數(shù)據(jù)集總體結(jié)構(gòu)

二.一個(gè)完整的MDX查詢

例一:一個(gè)簡單的MDX語句

SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE[TimeByDay].[month_of_year].&[3]

圖七:例一的MDX查詢得到的結(jié)果

a)

SELECT子句SELECT子句在MDX中也叫做查詢器軸,在SELECT語句中總共支持128個(gè)軸(即編號從0到127)。其中前五個(gè)軸(即編號0-4)有內(nèi)置命名,分別是:COLUMNS、ROWS、PAGES、CHAPTERS、SECTIONS。除了這五個(gè)軸可以通過命名和編號來訪問以外,其它的軸(5-127)都只能通過編號來訪問。在SSAS中通過MDX只能直接查看兩個(gè)軸的信息,也就是說在SSAS中執(zhí)行MDX的時(shí)候,這個(gè)MDX只能有兩個(gè)軸,即COLUMNS和ROWS,如果有更多的軸在SSAS中是無法顯示的。只能通過透視數(shù)據(jù)表或通過編程的方式來瀏覽。

在例一的MDX中,包含COLUMNS和ROWS兩個(gè)軸。在COLUMNS軸中,[Product].[ProductCategory–ProductClass].[產(chǎn)品目錄]表示了訪問的元組,這個(gè)元組的含義是:Product維度的名為ProductCategory–ProductClass的層次下的名為“產(chǎn)品目錄”這個(gè)等級所包含的所有成員。[Product]是維度名稱,[ProductCategory–ProductClass]是層次名稱,[產(chǎn)品目錄]是等級名稱。最外面的大括號表示集合,即所有[Product].[ProductCategory–ProductClass].[產(chǎn)品目錄]元組所組成的集合。由此可以看出MDX中軸的訪問順序是:維度層次等級成員。NONEMPTY的作用是過濾空值結(jié)果。查詢結(jié)果如圖七。

ROWS軸的結(jié)構(gòu)與COLUMNS相同,所有128個(gè)軸的基本訪問規(guī)則都是一樣。每個(gè)軸之間用逗號分隔。另外,在同一個(gè)軸中不能出現(xiàn)不同維度的元組。如下:

例二:錯(cuò)誤的MDX(一個(gè)軸中包含兩個(gè)維度的元組)

SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄],[Store].[StoreName].[StoreName]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE[TimeByDay].[month_of_year].&[3]

圖八:錯(cuò)誤信息例二是一個(gè)錯(cuò)誤的MDX查詢,因?yàn)樵贑OLUMNS軸中出現(xiàn)了兩個(gè)維度的元組,這樣的查詢在SSAS中會(huì)執(zhí)行的時(shí)候會(huì)報(bào)“函數(shù)中指定的兩個(gè)集具有不同的維數(shù)。”這樣的異常信息(如圖八)。可以這樣理解這種錯(cuò)誤:多維數(shù)據(jù)集就像是一個(gè)個(gè)的正方體,正方體的每一條邊都是一個(gè)維度,每一條邊也都只能表示一個(gè)維度,如果讓一條邊表示兩個(gè)維度自然就會(huì)出錯(cuò),這也是不符合邏輯的。

如果要將不同維度的元組集合放到同一個(gè)軸中就要使用叉積,即不同維度之間的笛卡爾積。叉積的使用有幾種不同的寫法,可以使用CROSSJOIN函數(shù)、可以將集合與集合用*號相乘,不過最簡單的就是直接把同一個(gè)軸中的不同維度用小括號括起來。可以把例二修改一下:

例三:修改后的例二,通過叉積使得可以在一個(gè)軸中觀察不同維度的數(shù)據(jù)

SELECTNONEMPTY{([Product].[ProductCategory-ProductClass].[產(chǎn)品目錄],[Store].[StoreName].[StoreName])}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE[TimeByDay].[month_of_year].&[3]

圖九:叉積查詢結(jié)果

例三就可以正常的運(yùn)行而不會(huì)出現(xiàn)例二的錯(cuò)誤了,不同之處僅僅是為兩個(gè)不同的維度加了個(gè)小括號。加了小括號后元組的結(jié)構(gòu)就發(fā)生了變化,不再是只由Product維度構(gòu)成,而是由Product和Store兩個(gè)維度共同構(gòu)成。小括號中可以包含多個(gè)維度或者是同一維度不同層次的元組,但是不能有相同維度的員一層次存在。如果存在某兩個(gè)相同維度的同一層次,在執(zhí)行MDX的時(shí)候會(huì)報(bào)“…層次結(jié)構(gòu)在CROSSJOIN函數(shù)中使用了多次”這樣的異常信息。

下面再舉出另外兩種CROSSJOIN的用法:

例四:另一種叉積的用法SELECTNONEMPTY{CROSSJOIN([Product].[ProductCategory-ProductClass].[產(chǎn)品目錄],[Store].[StoreName].[StoreName])}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE[TimeByDay].[month_of_year].&[3]

例五:第三種叉積用法SELECTNONEMPTY{{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄]}*{[Store].[StoreName].[StoreName]}}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE[TimeByDay].[month_of_year].&[3]

例四和例五都是叉積的使用方法,可以得到和例三相同的結(jié)果。因?yàn)樵赟SAS中不能直接查看兩個(gè)軸以上的查詢,但是可以使用叉積的方式將三個(gè)軸以上的查詢“平面化”到兩個(gè)軸中。這樣在理論上就可以直接在SSAS中查看多個(gè)軸的數(shù)據(jù)。這里我之所以要講“理論上”,是因?yàn)椴娣e這種運(yùn)算復(fù)雜度相當(dāng)?shù)馗撸绻麑⒍鄠€(gè)維度的元組集合進(jìn)行叉積的話可能等待很久也得不到結(jié)果,計(jì)算機(jī)甚至?xí)驗(yàn)榇罅康倪\(yùn)算而中斷程序。所以在實(shí)際中要盡量控制這樣的用法。如果要用最好首先將數(shù)據(jù)控制在一個(gè)非常有限的范圍之內(nèi),減少叉積帶來的運(yùn)算開消。

b)

FROM子句FROM子句表示MDX查詢的來源多維數(shù)據(jù)集,F(xiàn)ROM子句中只能包含一個(gè)多維數(shù)據(jù)集,也就是說同一個(gè)MDX查詢只能來自于同一個(gè)多維數(shù)據(jù)集,而不能像SQL查詢一樣將多個(gè)數(shù)據(jù)表連接起來。另外,MDX中的FROM子句也可以是另一個(gè)MDX查詢得到的一個(gè)子多維數(shù)據(jù)集,這樣就可以更加復(fù)雜的MDX查詢。如下面的例六所示:

例六:包含子多維數(shù)據(jù)集的復(fù)雜查詢

SELECT{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM(SELECT({[TimeByDay].[quarter].&[Q1]})ONCOLUMNSFROM[Foodmart多維數(shù)據(jù)立方])

c)

WHERE子句WHERE子句的另一個(gè)名稱是切片器軸,顧名思義它的作用主要就是對多維數(shù)據(jù)集進(jìn)行切片和切塊操作,限制數(shù)據(jù)集的大小。看下面的兩個(gè)例子:

例七:多維數(shù)據(jù)集切片操作SELECT{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE([Store].[StoreManager].&[Byrd])

圖十:切片得到的結(jié)果

例七在前面叉積例子的基礎(chǔ)上進(jìn)行了切片操作,將數(shù)據(jù)限制在了StoreManager為Byrd的范圍內(nèi)。例七的查詢得到的結(jié)果數(shù)據(jù)集從邏輯上包含三個(gè)軸,即產(chǎn)品目錄、門店名稱、地區(qū)編號。經(jīng)過切片后,保留了產(chǎn)品目錄和門店名稱兩個(gè)軸,另一個(gè)地區(qū)因?yàn)榍衅僮髦皇O翨yrd所對應(yīng)的地區(qū)。查詢結(jié)果如圖十所示。

例八:多維數(shù)據(jù)集切塊操作SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[產(chǎn)品目錄]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地區(qū)]}ONROWSFROM[Foodmart多維數(shù)據(jù)立方]WHERE([TimeByDay].[quarter].&[Q1]:[TimeByDay].[quarter].[Q2],[Store].[Store].&[18]:[Store].[Store].&[20],[Product].[ProductCategory].&[CannedClams]:[Product].[ProductCategory].&[CannedSardines])

圖十一:切塊所得到的結(jié)果

例八在前面叉積的基礎(chǔ)上進(jìn)行了切塊操作,分別在時(shí)間維度、門店維度、產(chǎn)品維度上進(jìn)行了限制。圖十一是這個(gè)MDX查詢所得到的結(jié)果。

d)

WITH子句WITH子句用于創(chuàng)建臨時(shí)的命名計(jì)算成員及命名集合。通過WITH子句創(chuàng)建的命名計(jì)算成員和命名集合其生命周期有限,只限于與WITH子句相鄰的MDX查詢,當(dāng)MDX查詢結(jié)束后,用WITH子句創(chuàng)建的命名計(jì)算或命名集合也隨之失效。如果要?jiǎng)?chuàng)建在整個(gè)會(huì)話過程中都保持有效的命名計(jì)算和命名集合的話,就要使用CREATEMEMBER和CREATESET語句。下面的例子演示了臨時(shí)命名計(jì)算和臨時(shí)命名集合的用法和查詢結(jié)果:

例九:臨時(shí)命名計(jì)算和臨時(shí)命名集合的使用WITHMEMBER[Measures].[AvgOfUnitsShipped]AS'AVG({[Product].[Product].[Product]},[Measures].[UnitsShipped])',FORMAT_STRING='###,###,###,##0.00'SET[CROSSSET_StoreName]AS'{[Store].[StoreName].[StoreName].[Store1]}'SET[CROSSSET_TIME]AS'{[TimeByDay].[month_of_year].[month_of_year]}'SELECTNONEMPTY{[Measures].[AvgOfUnitsShipped]}ONCOLUMNS,NONEMPTY[CROSSSET_StoreName]*[CROSSSET_TIME]ONROWSFROM[Foodmart多維數(shù)據(jù)立方]

圖十二:臨時(shí)命名計(jì)算和命名集合的查詢結(jié)果

WITHMEMBER語句最后的FORMAT_STRING是用于格式化數(shù)據(jù)結(jié)果的,在例九中,我把得到的平均值結(jié)果格式化為了保留兩位小數(shù),并進(jìn)行千分位分隔。其它的常用格式符還有PERCENT、CURRENCY等。

三.常用函數(shù)大多數(shù)聚合函數(shù)都有兩個(gè)或兩個(gè)以上的參數(shù),其中第一個(gè)參數(shù)通常是用于計(jì)算的集合即進(jìn)行計(jì)算的范圍,后面的參數(shù)通常是用于計(jì)算的度量或數(shù)據(jù)。1.

AVG函數(shù):a)

功能:求平均值b)

用法:

AVG({[Product].[Product].[Product]},[Measures].[UnitsShipped])

2.

MAX函數(shù):a)

功能:求集合中的最大值。b)

用法:

MAX({[Product].[Product].[Product]},[Measures].[UnitsShipped])3.

MIN函數(shù):a)

功能:求集合中的最小值。b)

用法:

MIN({[Product].[Product].[Product]},

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論