zoukankan      html  css  js  c++  java
  • 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])
     
    其实,我还试图过直接写在MDXselect中,不过不行,会报错,原因,我还搞不清楚,有哪位大虾明白的话,不凡指点一二,难道是切片技术不能直接写在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 函数需要2 参数使用一个元组集表达式。实际使用的却是字符串或数值表达式。
     
    需求四:得到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看来只能用在不需要小计、总计的地方,那如果又必须要小计,怎么办呢,大家琢磨琢磨

  • 相关阅读:
    最课程阶段大作业03:用半天实现淘宝首页?
    最课程阶段大作业02:实现自己的利息计算器
    最课程阶段大作业之01:使用SVN实现版本控制
    Java全栈程序员之01:做个Linux下的程序猿
    最课程学员启示录:这么PL的小姐姐你要不要
    学员优秀博文赏析:泛型通配符及约束
    魅族便签,是否能成为国内便签应用的No.1?
    Ubuntu上安装git和创建工作区和提交文件!!!
    OpenGL核心技术之HDR
    病毒木马查杀实战第020篇:Ring3层主动防御之基本原理
  • 原文地址:https://www.cnblogs.com/guanjie20/p/1652011.html
Copyright © 2011-2022 走看看