通常来讲,在创建多维数据集时关于量度的设计一般有两种做法,一种做法是将各种指标设置为我们的量度,例如收入、成本、费用等等,另一种做法是建立一个称为指标的维度,包括收入、成本、费用等成员,而量度则只变称一个,我们可以将其称为量度,那么,这两种做法哪一种更正确呢?我们在这里推荐使用第二种做法。
第一种做法存在的问题:
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 ;
posted on 2010-07-26 15:28  金立钢  阅读(222)  评论(0)    收藏  举报