15個經典的MDX 1 3

2021-05-28 12:25:32 字數 4424 閱讀 5371

讀者請求最多的是更多的mdx資訊。他們通常要求更多的mdx例子,在這裡,我提供15個典型的mdx語句,用的是sql server 2000 analysis services' foodmart 2000 sample cubes,以下例子都以sales多維資料集為例。

1. 在美國所有州都銷售的有那些產品品牌?

listing 1 建立了個自定義集合soldinusa,該集合排除了在整個美國unit sales為空值的品牌。該查詢定義了乙個計算成員,描述current state是否銷售current product;如果有銷售返回yes,否則返回no。這個查詢在columns顯示states,在rows顯示produts,單元值區域依據product-state的聚合交集顯示yes或no.

或許你已經發現,該查詢會返回的結果同個品牌會返回多次。sales cube是依據brand來給products分類的(把產品類別分成不同的品牌),所以如果某品牌生產多種產品,該品牌在層次結構中將多次出現。乍一看,這種重複出現確實是個問題,大概你會把多次出現的同個品牌當成不同的品牌。舉個例子,乙個公司(對應乙個品牌)生產luggage和clothes,作為本例分析,最好將其當成不同品牌來理解,這樣才不至於因為其不銷售luggage就判斷該品牌沒有銷售(實際情況其可能銷售clothes)而導致錯誤。

listing 1: determining products sold in each state

說明: 查詢在所有州都銷售的品牌。

with set [soldinusa] as 'filter([product].[brand name].members, not isempty( ([usa], [unit sales]) ))'

member [measures].[soldinstate] as 'iif( isempty(([product].currentmember, [unit sales],

[customers].currentmember)), "no","yes" )'

select [usa].children on columns,

[soldinusa] on rows

from sales

where ([soldinstate])

注 :filter

返回根據搜尋條件對集合進行篩選所得到的集合。

例子select  on columns,

on rows from sales  

iif返回由邏輯測試確定的兩個數值或字串值之一。

例子with member measures.abc as 'iif(isempty(measures.[unit sales]),"空了","不空")'

select * } } on columns , on rows  from [sales]

2.所有商店中銷售前10名的產品類別有哪些?

listing 2 直接利用topcount()函式查詢銷售前10名的產品。

(這是一種最直接的方法,topcount()函式本身自帶排序(降序)的功能)

listing 2: determining top 10 product categories

說明:查詢銷售前10名的產品類別

select on columns,

topcount( [product].[product category].members, 10, ([unit sales]) ) on rows

from sales

查詢結果展示:

3.  在美國,剛剛過去的三個季度裡都有銷售量的食品和飲料有哪些?

(這個查詢也可以理解為「過去三個季度裡食品和飲料銷售量都不為0的產品有哪些?」)。查詢listing 3 示範了如何動態的確定對應的時間集合—這是一項很有價值的技巧。時間集合動態隨著cube資料的更新而改變(也就是說該查詢無論你在什麼時候執行,無論cube的資料作了多少次更新,結果都是最近三個月的資料)。首先,自定義集合lastquarter定義了時間維度中有銷售記錄的最近乙個季度。自定義集合last3quarters在lastquarter的基礎上利用range()函式(實際沒有range()函式,冒號:就是作者說的函式)指定了以lastquarter為最後乙個季度的連續的三個季度。我不直接在last3quarter(原文是lastquarter,我認為是作者筆誤)的定義中使用tail()函式是因為這樣做返回的可能不是連續的三個季度;因為空記錄的季度肯能出現在任何季度,filter()函式只能排除掉空季度。lag()函式結合range()函式,確保了返回的三個季度是連續的。

在這個查詢中,item(0).item(0) 函式取得指定集合的第乙個成員,因為集合在技術上就是一組元組[如:來自不同維度的一系列成員也可以組成乙個元組],所以用第乙個item()函式選擇元組,第二個item()選擇該元組裡的成員。(我們可以這樣理解,集合由元組組成,元組由成員組成)。

listing_03.determining brands sold during the past three quarters.txt

說明:在過去三個季度裡都存在銷售量的商品銷售記錄

with set[lastquarter]as'tail(filter([time].[quarter].members,not

isempty([time].currentmember)),1)'

set[last3quarters]as' [lastquarter].item(0).item(0).lag(2) : [lastquarter].item(0).item(0)'

select[last3quarters]on columns,

non empty union(descendants( [food], [product].[brand name] ),descendants( [drink],

[product].[brand name] ))on rows

fromsales

查詢結果展示:

注:topcount

從集合頂端開始返回指定數目的項,可以選擇首先對集合排序。

例子select  on columns,

topcount(descendants([store].[all stores].[usa],[store].[store city] ), 10, [store sales])   on rows from sales

subset

從集合中返回元素的子集。

例子select      on columns,

on rows from sales

tail

從集合尾部返回子集。

例子select      on columns,

on rows from sales

lag返回指定成員的所在維度上的上乙個成員。

例子with member [measures].[a1] as 'time.currentmember.lag(1).name'   

select on columns , on rows  from [sales]

filter

返回根據搜尋條件對集合進行篩選所得到的集合。

例子select  on columns,

on rows from sales   

item

從集合中返回指定元組或者從元組中返回指定成員。

例子with set kkk as '* }'

member measures.jjj as 'tupletostr(kkk.item(0).item(0))',solve_order=1

select  on columns,

on rows

from sales

union

返回兩個集合的並集,可以選擇保留重複項。

例子select  on columns,

union(usa.children, canada.children, all)

on rows from sales

翻譯介紹15個經典的MDX查詢 04 05

04,最近銷售趨勢最好的產品有哪些?查詢listing 4首先利用topcount 查得銷售最好的產品,然後利用上個查詢listing 3 介紹過的動態時間技巧定義最近6個月的銷售量。該查詢安排在行顯示銷售最好的10種產品,列顯示最近的6個月,值區域為這6個月的unit sales。你可以用線狀圖展...

翻譯介紹15個經典的MDX查詢 02and03

02.所有商店中銷售前10名的產品類別有哪些?listing 2 直接利用topcount 函式查詢銷售前10名的產品。這是一種最直接的方法,topcount 函式本身自帶排序 降序 的功能 listing 2 determining top 10 product categories 說明 查詢銷...

15個很具代表性的MDX查詢語句

15個很具代表性的mdx查詢語句 出處 www.sqlmag.com 原作者russ whitney 02.所有商店中銷售前10名的產品類別有哪些?listing 2 直接利用topcount 函式查詢銷售前10名的產品。這是一種最直接的方法,topcount 函式本身自帶排序 降序 的功能 lis...