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