Mondrian>>MDX语法学习--filter与iif的使用

我们建好立方体之后,就可以使用MDX语法大展拳脚,下面我们以一个简单的例子逐步展开
先介绍一下我们的立方体,通过这个例子来学习filter与iif的使用。
 
我们首先谈需求
 
需求一:得到20095月,产品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])
 
需求二:得到20095月,产品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] )
需求三:得到20095月,产品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],0)
       ,IIf([Measures].[ 是否目标医生 ] = true ,  [Measures].[Year_Pres_Quantity],0)) on 0
       ,non empty [cust].[City_Name].[City_Name]
        on 1
       from [ 医院销售分析 ]
       WHERE ([ 月份 ] .& [2009-05-01T00:00:00] , [material] . [Material] .& [BM00000001] )
      
出错: Axis0  函数需要 参数使用一个元组集表达式。实际使用的却是字符串或数值表达式。
 
需求四:得到20095月,产品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看来只能用在不需要小计、总计的地方,那如果又必须要小计,怎么办呢,大家琢磨琢磨


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值