多維查詢表示式

2021-08-31 05:13:59 字數 4274 閱讀 4754

mdx 的全稱是 mutil

dimensional expressions ,是由 microsoft , hyperion 等公司研究多維查詢表示式,是所有 olap 高階分析所採用的核心查詢語言。

mdx 可以用來進行以下操作:

1.        

calculated members (計算成員)

2.        

calculated cells (計算單元)

3.        

security settion

(安全設定)

4.        

custom member formula ( 自定義函式 )

5.        

custom level rollup ()

6.        

actions (動作)

7.        

named 「 sets 」 ( 命名集合 )

8.        

server side formatting (伺服器資料格式化)

mdx 的基本結構有三種: members 、 tuple

、 set 。

1.        

members :指的是維度樹上的乙個節點,這裡有一點需要指出,量度也是乙個特殊的維度,所以對於普通維度上的 member 可以有幾下幾種表示方法: [customer] 或 [time].[1996] 等,對於特殊的維度——量度而言,也可以表示乙個 member ,如: [measures].[ unit sales] 等。

member 的表示方法就是用中括號的形式,「 [……] 」。

2.        

tuple

:是由若干個 members 組成,每乙個維度上最多只能有乙個 member ,對於乙個 tuple

而言至少有乙個維度,多則不限,同時對於沒有列出來的那就表示為預設的 member 。 tuple

的表示方法是小括號「 () 」,因為其又有 member 構成,所以通常的格式為「 ([…],[…][…],…) 」;示例:

a)        

([regin ].[usa])

b)       

([product].[ computers],[time].[2008]) 。

3.        

sets :同一維度上若干個 members 的集合,或者是若干個 tuples

的集合,但這裡有乙個地方需要注意,那就是如果是若干個 tuple

組成的集合是,各個 tuple

裡的 member 之間存在著一定的對應關係。集合的表示方法用大括號「 {} 」,所以可能的表示方法為:

a)        

,這裡 set 是由同一維度的若干個 member 組成。

b)       

,這個 set 是由兩個 tuples

組成,這裡大家可以看到,在第乙個 tuple

當中,第乙個 member 是名為 computer 的產品,所以後面的 tuple

的第乙個 member 也必須是乙個產品,所以我們這裡看到的是 mobile ,第乙個 tuple

裡第二個 member 是乙個國家,所以第二個 tuple

的第二個 member 也必須是乙個國家名,依次類推。

乙個標準的 mdx 查詢語句就是由我們前面介紹的 mdx 的三個基本物件構成,也就是 member 、 tuple

、 set 。

乙個標準的 mdx 查詢的語法如下:

select set on columns,

set on rows

from cube

where tuple

示例:

select

on columns,

on rows

from

[sales]

where

([measures].[

storesales ])

這個 mdx 查詢就表示:查詢時間為 1997 和 1998 兩年的 drink 類產品,女消費者和 food 類產品男消費者的 store sales 。

它的作用是列出指定分類下的所有項,如

1.        

[product type].[food].children ,這就表示列出產品型別為 food 的所有產品。

2.        

[region ].[country].children ,這就表示列出所有的國家名稱。

該函式不能用在 tuple

中 當前某個 member ,舉例:

某個產品銷售額貢獻度計算,對於某乙個產品或一種型別的產品而言它的銷售額貢獻度指的是它的銷售額與所有產品銷售額的比值,此時,如果我們要用 mdx 來計算這個貢獻度的值是可以採用 currentmember

來實現,如:

此時我們的 mdx 表達可以是:

([product].currentmember

,[ measures].[stores sales]) / ([product].[ all products],[measures].[stores sales])

同時因為預設情況下指的就是 currentmember

,所以上面的 currentmember

可以去掉:

([measures].[ stores sales]) / ([product].[ all products],[measures].[stores sales])

所有 mdx 表示式的寫法是由若干個 tuple

組成 ,比如上面的這個表示式就是由兩個 tuple

的相除構成。

這兩個元素分別指的是當前 member 的上乙個 member 和當前 member 的下乙個 member 。

利用這兩個元素我們可以來實現實際當中常見的同期比(前期比),所謂的同期比指的 是:

(當前 member- 當前 member 的前乙個 member ) / 當前 member 的前乙個 member

對應到 mdx 表示式我們可以用 prevmember

和 nextmember

來實現,如:

(([time].currentmember

,[ measures].[store sales])-([time].prevmember ,[measures].[storessales ])) /

([time].prevmember

,[ measures].[store sales])

當然因為 currentmember

可以省略,所以上面的寫法也可以是:

(([ measures ].[store sales])-([time].prevmember ,[measures].[storessales ])) /

([time].prevmember

,[ measures].[store sales])

下面的這張圖就顯示乙個樹

這張圖中 all 這個節點是 97 和 98 的 parents , 97 和 98 也是 all 的 children ,同時 97 是 all 的 firstchild

如果我們要取到 97 下的所有的月份,那麼我們就需要用 descendants 來實現,它的語法是:

descendants(

[time].[97],month) ,這裡的 month 是乙個 level 的名稱。所有它的格式為: descendants([ 乙個 member], 乙個 level 的名稱 )

比如在食品銷售當中,我們要知道哪一類的食品更受消費者歡迎,這樣我們需要只知道各類食品的銷量,比如食物( food )、飲料 (drink) 等的具體銷量 (unit sales) ,然後再計算出所有食品總的銷量( total sales ) , 如果採用 mdx 我們可以很容易的實現,採用 mdx 後的計算哪種食品更受歡迎的表示式如下:

([food].currentmember

,[ measures].[unit sales]) /

([food].currentmember.parent

,[ measures].[total sales])

因為 currentmember

可以省略,所以上面的寫法又可以是:

( [measures].[unit sales]) /

([food].currentmember.parent

,[ measures].[total sales])

未完待續 ……

Mdx多維表示式

一 命名成員 1 計算成員 度量維度 不可以使度量維度的子成員 with member measures total as measures 缺貨庫存 measures 不動銷庫存 select on columns,non empty on rows from repertory examinat...

查詢表示式

這個特性使得你可以在c 中使用sql類似風格的語句,也被稱作linq 語言整合查詢 舉例來說,你可以這樣描述你的資料 ublic class coordinate 在c 裡,你可以像下面一樣輕鬆的宣告乙個資料庫表的邏輯等同式 use object and collection initializer...

查詢表示式

版本 新增功能 5.0.9 比較運算增加閉包子查詢支援 5.0.4 支援對同乙個字段多次呼叫查詢方法 查詢表示式支援大部分的sql查詢語法,也是 thinkphp 查詢語言的精髓,查詢表示式的使用格式 where 欄位名 表示式 查詢條件 where or 欄位名 表示式 查詢條件 表示式不分大小寫...