MDX中Filter与IIF
发布时间:2020-12-12 15:13:25 所属栏目:MsSql教程 来源:网络整理
导读:MDX语法学习(一)filter与iif的使用 标签: MDX sqlserver filter iif 维度 ? 当我们建好立方体之后,就可以使用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,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 ,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,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语法学习(二)再揭密! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |