咱們首先談需求
需求一:獲得
2009
年
5
月,產品
BM00000001
的各城市年累計處方量
需求分析:
度量值:年累計處方量
[Year_Pres_Quantity]
維度:
[cust].[City_Name].[City_Name]
條件:
[
月份
].&[2009-05-01T00:00:00]
,
[material].[Material].&[BM00000001]
所以,構造咱們的
MDX
以下:
select
[Measures]
.
[Year_Pres_Quantity]
on 0
,non empty [cust].[City_Name].[City_Name] on 1
from [
醫院銷售分析
]
WHERE ([
月份
]
.&
[2009-05-01T00:00:00]
,
[material]
.
[Material]
.&
[BM00000001])
需求二:獲得
2009
年
5
月,產品
BM00000001
的各城市
目標醫生
的年累計處方量
注意:這裏多了一個要求,必須是目標醫生的
在咱們的傳統
SQL
中,這是很容易實現的,咱們在
where
中增長一個
where
是否目標醫生
=true
便可
可是,在
MDX
中,
where
後面只能接維度,是否目標醫生並非咱們的維度
那麼,怎麼辦呢?
輪到
filter
上場了
構造咱們的
MDX
以下:
select ([Measures].[Year_Pres_Quantity]) on 0
,non empty filter([cust].[City_Name].[City_Name]
,
[Measures]
.
[
是否目標醫生
]
=
true
)
on 1
from [
醫院銷售分析
]
WHERE ([
月份
]
.&
[2009-05-01T00:00:00]
,
[material]
.
[Material]
.&
[BM00000001]
)
需求三:獲得
2009
年
5
月,產品
BM00000001
的各城市
目標醫生和非目標醫生各自
的年累計處方量
在咱們的傳統
SQL
中,這種需求能夠經過
case when
來實現,那麼在
MDX
裏有沒有相似的東西呢?
固然有,輪到
iif
上場了
構造咱們的
MDX
以下:
WITH
MEMBER
[
目標醫生年累計處方量
]
AS 'IIf([Measures].[
是否目標醫生
]=false, [Measures].[Year_Pres_Quantity],null)'
MEMBER [
非目標醫生年累計處方量
]
AS
'IIf([Measures].[
是否目標醫生
]=true, [Measures].[Year_Pres_Quantity],null)'
select {[
目標醫生年累計處方量
]
,
[
非目標醫生年累計處方量
]
}
on 0
,non empty [cust].[City_Name].[City_Name] on 1
from [
醫院銷售分析
]
WHERE ([
月份
]
.&
[2009-05-01T00:00:00]
,
[material]
.
[Material]
.&
[BM00000001]
)
其實,我還試圖過直接寫在
MDX
的
select
中,不過不行,會報錯,緣由,我還搞不清楚,有哪位大蝦明白的話,不凡指點一二,難道是切片技術不能直接寫在
Select
中?
select (IIf([Measures].[
是否目標醫生
]
=
false
,
[Measures].[Year_Pres_Quantity],)
,IIf([Measures].[
是否目標醫生
]
=
true
,
[Measures].[Year_Pres_Quantity],)) on 0
,non empty [cust].[City_Name].[City_Name]
on 1
from [
醫院銷售分析
]
WHERE ([
月份
]
.&
[2009-05-01T00:00:00]
,
[material]
.
[Material]
.&
[BM00000001]
)
出錯:
Axis0
函數須要
2
參數使用一個元組集表達式。實際使用的倒是字符串或數值表達式。
需求四:獲得
2009
年
5
月,產品
BM00000001
的各城市
目標醫生和非目標醫生各自
的年累計處方量,而且要獲得總計欄
粗一看,這個需求和需求三沒啥區分,不就是要獲得總計嗎,數據倉庫裏獲得總計很容易哪,用merber就能夠了,咱們來寫寫
WITH
MEMBER
[
目標醫生年累計處方量
]
AS 'IIf([Measures].[
是否目標醫生
]=false, [Measures].[Year_Pres_Quantity],null)'
MEMBER [
非目標醫生年累計處方量
]
AS
'IIf([Measures].[
是否目標醫生
]=true, [Measures].[Year_Pres_Quantity],null)'
select {[
目標醫生年累計處方量
]
,
[
非目標醫生年累計處方量
]
}
on 0
,non empty [cust].[City_Name].merber on 1
from [
醫院銷售分析
]
WHERE ([
月份
]
.&
[2009-05-01T00:00:00]
,
[material]
.
[Material]
.&
[BM00000001]
)
看看,把
[cust]
.
[City_Name]
.
[City_Name]
改成
[cust]
.
[City_Name]
.
merber
總計就出現啦!是否是大功告成了呢?
別急,仔細看看,咦,爲何
目標醫生和非目標醫生
下的小計值都是同樣的?
哎,這就是數據倉庫的特點哪
任何一個東西都不是十全十美的
數據倉庫,他的速度之因此這麼快,是由於他用立方體把不少數據都事先存好了,這樣,你要總計,他就能直接給你找出來,不須要二次計算,但是,若是你要
iif
以後的小計,他就無能爲力了,由於他沒有存這樣的數據哪!
MDX語法學習(一)filter與iif的使用就到這裏了,IIF看來只能用在不須要小計、總計的地方,那若是又必需要小計,怎麼辦呢,你們琢磨琢磨,偶們MDX語法學習(二)再揭密!函數