量度设计技巧

--金立钢原创,转贴请注明出自微软BI开拓者www.windbi.com

      通常来讲,在创建多维数据集时关于量度的设计一般有两种做法,一种做法是将各种指标设置为我们的量度,例如收入、成本、费用等等,另一种做法是建立一个称为指标的维度,包括收入、成本、费用等成员,而量度则只变称一个,我们可以将其称为量度,那么,这两种做法哪一种更正确呢?我们在这里推荐使用第二种做法。

    第一种做法存在的问题:
                1.无法实现指标的层次结构
                2.无法实现计算成员的钻取
                3.需要创建过多的同比和环比计算成员
                4.指标过多的话,选择很不方便
                5.新增指标对数据仓库的结构变动过大
                6.无法实现各指标的单位
    为了解决这些问题,我们可以采取第二种做法。我们先创建一个维度(父子型),让每一个指标成为维度的成员,我们就可以解决以上问题。但同时也会引发一些新的问题:
                1.量度的半累加性问题
                2.量度的格式问题
    当我们将常规的量度创建为维度成员时,如何针对于不同的维度成员使用不同的聚合方法将会是一个难题。
    我们将依据于聚合函数的种类来创建量度,如:


量度名称
聚合函数
例如:
量度一
Sum
收入、成本
量度二
Count
记录单数
量度三
Distinct Count
人数
量度四
Max
最高值
    将所有的量度隐藏,创建一个计算成员,它将依据于维度的不同成员而等于相应的量度值,如:
          当我们选择收入或成本时,计算成员=量度一
          当我们选择人数时,计算成员=量度三

    其中,量度的半累加性问题请参考技巧四解决,对于量度的格式问题则可以通过脚本来解决,在脚本中利用Case语句指定不同的维度成员,量度使用不同的格式。

CREATE MEMBER CURRENTCUBE.[MEASURES].[计算成员]


AS


    case


        when [科目].[科目父级编号].currentmember=[科目].[科目父级编号].&[96] then [Measures].[金额]


      else



[Measures].[
金额计数]




end,


FORMAT_STRING =


    case


      when [科目].[科目父级编号].currentmember=[科目].[科目父级编号].&[96] then ";Percent"


    else


      "#,#.00"


end;

    在SQL Server 2005中,可以在同一个多维数据集中存在多个量度组。这样,我们的量度就分散在不同的量度组中,那么,在这种情况下我们如何来解决上面的问题呢?
    我们同样需要创建一个指标维度, 这个指标维度将和所有的量度组关联,新建一个计算成员做为量度,它将等于所有量度组的量度相加(经过前一段的转换,每个量度组只剩下一个量度了。)这将是我们最后的量度。

CREATE MEMBER CURRENTCUBE.[MEASURES].[量度]


AS [Measures].[金额]+[Measures].[非税收入],


VISIBLE = 1
;

   
      关于第二种做法,希望大家能够在实际应用中体会,与脚本配合使用,会实现更强大的功能。
最后编辑jinligang 最后编辑于 2007-09-05 12:03:02