MDX中Filter与IIF

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

标签: MDX sqlserver filter iif 维度

 

当我们建好立方体之后,就可以使用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],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 参数使用一个元组集表达式。实际使用的却是字符串或数值表达式。
 
需求四:得到 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语法学习(二)再揭密!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MDX 的重要概念 使用成员、元组和集 (MDX) MDX 语法元素 标识符 表达式 使用多维数据集表达式和子多维数据集表达式 使用维度表达式 使用成员表达式 使用元组表达式 使用集表达式 使用标量表达式 使用空值 运算符(MDX 语法) 算术运算符 位运算符 比较运算符 串联运算符 集运算符 一元运算符 赋值运算符 函数(MDX 语法) 使用字符串函数 使用数学函数 使用逻辑函数 使用成员函数 使用元组函数 使用集函数 使用维度函数、层次结构函数和级别函数 使用存储过程 (MDX) 注释(MDX 语法) 保留关键字(MDX 语法) MDX 查询基础知识 基本 MDX 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例使用查询轴和切片器轴 在查询建立多维数据集上下文 在 MDX 生成子多维数据集 在 MDX 生成命名集 创建查询作用域的命名集 创建会话作用域的命名集 在 MDX 生成计算成员 在 MDX 生成单元计算 创建和使用属性值 操作数据 修改数据 使用变量和参数 MDX 脚本编写基础知识 基本 MDX 脚本 管理作用域和上下文 错误处理 支持的 MDX MDX 语言参考 MDX 语法约定 MDX 语句参考 MDX 脚本编写语句 MDX 数据定义语句 MDX 数据操作语句 MDX 运算符参考 --(注释) -(排除) -(负) -(减) *(叉积) *(乘) /(除) ^(幂) /*...*/(注释) //(注释) :(范围) +(加) +(正) +(字符串串联) +(联合) <(小于) <=(小于或等于) (不等于) =(等于) >(大于) >=(大于或等于) AND IS NOT OR XOR MDX 函数参考 AddCalculatedMembers Aggregate AllMembers Ancestor Ancestors Ascendants Avg Axis BottomCount BottomPercent BottomSum CalculationCurrentPass CalculationPassValue Children ClosingPeriod CoalesceEmpty Correlation Count(维度) Count(层次结构级别) Count(集) Count(元组) Cousin Covariance CovarianceN Crossjoin Current CurrentMember CurrentOrdinal CustomData DataMember DefaultMember Descendants Dimension Dimensions Distinct DistinctCount DrilldownLevel DrilldownLevelBottom DrilldownLevelTop DrilldownMember DrilldownMemberBottom DrilldownMemberTop DrillupLevel DrillupMember Error Except Exists Extract Filter FirstChild FirstSibling Generate Head Hierarchize Hierarchy IIf Intersect IsAncestor IsEmpty IsGeneration IsLeaf IsSibling Item(成员) Item(元组) KPIGoal KPIStatus KPITrend KPIWeight KPICurrentTimeMember KPIValue Lag LastChild LastPeriods LastSibling Lead Leaves Level Levels LinkMember LinRegIntercept LinRegPoint LinRegR2 LinRegSlope LinRegVariance LookupCube Max MeasureGroupMeasures Median Members(集) Members(字符串) MemberToStr MemberValue Min Mtd Name NameToSet NextMember NonEmpty NonEmptyCrossjoin OpeningPeriod Order Ordinal ParallelPeriod Parent PeriodsToDate Predict PrevMember Properties Qtd Rank RollupChildren Root SetToArray SetToStr Sib

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值