复杂或有趣的MDX问题求解(5)- 测量值的条件格式化

在某些情况下, MDX查询中单一测量值的格式不是唯一的,也就是说测量值在不同的情况下需要设置并显示为不同的数据格式或展示格式。

问题描述

有一个计算成员 [Stat OB Report] 定义如下
Case
        When [DimIntegrate].[DI_AttributeName].CurrentMember
        IS [DimIntegrate].[DI_AttributeName].[Call Lists consumed]
            Then [Measures].[Q Call Lists Consumed]
        When [DimIntegrate].[DI_AttributeName].CurrentMember
        IS [DimIntegrate].[DI_AttributeName].[Reachable]
            Then [Measures].[Reject reasons (%)]
        .........
        ELSE
            0 

        1) [Stat OB Report] 的格式为默认的空
        2) [Measures].[Reject reasons (%)] 也是一个计算成员,格式显示为百分比格式  FORMAT_STRING = "Percent"
        3) [Measures].[Q Call Lists Consumed] 就是一个求个数普通的度量值


存在问题:
      [Measures].[Reject reasons (%)] 不会显示成百分比格式, 而是显示为 [Stat OB Report]的格式, 也就是说计算成员[Stat OB Report]设置成什么格式,[Measures].[Reject reasons (%)] 就显示什么格式,而想要的结果是:
          (因为下面会分很多种条件),根据每个条件调用不同的 度量值或计算成员, 每个计算成员显示自己的实际的格式。

问题来源: CSDN lottery009(http://hi.csdn.net/lottery009)

假设

以SSAS2008自带的Adventure Works示例Cube作为测试的数据环境。

解答

在MDX语句中自定义计算成员时,可以为计算成员设置数据格式,是通过FORMAT_STRING属性来设置的。

FORMAT_STRING除了可以直接定义为常见的字符串、数字或日期等的格式串(比如“##,###”)之外,还可以定义为MDX子语句(只要子语句可以计算出合法的格式化串即可)。

所以,上文的问题可以采用如下方式解决:

在 [Stat OB Report] 的定义中,增加Format_String属性定义:

Format_String=

When [DimIntegrate].[DI_AttributeName].CurrentMember
        IS [DimIntegrate].[DI_AttributeName].[Call Lists consumed]
            Then '##,###'
        When [DimIntegrate].[DI_AttributeName].CurrentMember
        IS [DimIntegrate].[DI_AttributeName].[Reachable]
            Then '##,##%'

 

更多示例

1)在Adventure Works示例中,打算根据销售渠道统计订单数量,因已知互联网渠道的订单特别多,可以将互联网订单数量除以1000,并在其后标注“(千次)”的字样;而普通渠道因订单很少,则不除以1000。

with member [Measures].[订单数量] AS '[Measures].[Order Count]',
     Format_String=Case
                   WHEN [Sales Channel].CurrentMember is [Sales Channel].[Sales Channel].&[Reseller]
                   THEN '##,###'
                   WHEN [Sales Channel].CurrentMember is [Sales Channel].[Sales Channel].&[Internet]
                   THEN "###,.00/(千次)" END
select {[Measures].[订单数量]} on 0,
       {[Sales Channel].[Sales Channel].&[Internet],[Sales Channel].[Sales Channel].&[Reseller]} on 1
       from [Adventure Works]

运行结果如下,图中27.66(千次)的实际值为27659:

image

进一步要说明的是,MDX中许多属性赋值表达式的右侧都可以是“子MDX语句”,比如,进一步为上述例子根据数据大小区间设置颜色属性:

 

with member [Measures].[订单数量] AS '[Measures].[Order Count]',
     Format_String=Case
                   WHEN [Sales Channel].CurrentMember is [Sales Channel].[Sales Channel].&[Reseller]
                   THEN '##,###'
                   WHEN [Sales Channel].CurrentMember is [Sales Channel].[Sales Channel].&[Internet]
                   THEN "###,.00/(千次)" END,
     FORE_COLOR=iif( [Measures].[订单数量]>10000,RGB(0,255,0),RGB(255,0,0))
select {[Measures].[订单数量]} on 0,
       {[Sales Channel].[Sales Channel].&[Internet],[Sales Channel].[Sales Channel].&[Reseller]} on 1
       from [Adventure Works]

 

 

 


你可能感兴趣的:(商业智能(DW/BI),商业智能之路)