讀者請求最多的是更多的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...