量度设计技巧
--金立钢原创,转贴请注明出自微软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
; 关于第二种做法,希望大家能够在实际应用中体会,与脚本配合使用,会实现更强大的功能。