您的位置:首页 > 其它

MDX语法学习(一)filter与iif的使用

2011-07-19 15:08 295 查看
当我们建好
立方体之后,就可以使用
MDX语法大展拳脚,下面我们以一个简单的例子逐步展开

先介绍一下我们的立方体,通过这个例子来学习filter与iif的使用。

我们首先谈需求

需求一:得到
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语法学习(二)再揭密!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: