AverageOfChildren
BI项目中,我们经常需要设计“平均值”这样的指标,例如电子商务中的平均销售额,Web分析中的平均访问时长,等等。而Analysis Service中提供了一个“AverageOfChildren”的聚合方式,看上去好像就是为了这样的需求而设计的。
但是测试结果却发现,得到的数据根本就不是我们期望的。后来查资料找到了关于这个聚合方式的说明:
AverageOfChildren——对某个成员的聚合值等于其所有子成员的平均值。
这是什么意思呢?假设我定义了一个“总销售额”和“平均销售额”这两个指标。当我看中国的数据的时候,假设中国的总销售额是34000万的话,因为中国下面有34个省级行政区(34个Member),因此平均销售额就是1000万。这是按照字面上的理解。但实际上,这样理解是错误的。MSDN上给出的解释并没有明确指明,AverageOfChildren这个聚合方式只是针对时间维度起作用。
在Analysis Service中内置了很多常见的维度类型,如时间维度,地理纬度,帐户维度等。你可以将你创建的维度的“类型”属性标记为内置的维度类型。这样的好处是,Analysis Service对这些标记为特殊类型的维度有额外的支持。例如如果你的Cube中包含一个标记为“时间维度”类型的维度时,那么你就可以在Mdx中使用和时间相关的函数,如Ytd等。类似的,AverageOfChildren这个聚合类型也是需要时间维度的支持,你首先需要在工程中显式指定至少一个时间维度。这个聚合方式的意义就是对所有的时间——以天为单位——求平均值。例如当前时间维度选择的成员是[2003年],而03年有销售额数据的共有365天,那么
AverageOfChildren(销售额) = 总销售额 / 365
如果范围再进一步缩小,选择[2003年3月份],由于3月份每天都有销售额,因此AverageOfChildren就等于总销售额除以31。你可以按具体日期去查看,你会发现,每天的总销售额和平均销售额是一样的。这是因为具体日期的粒度已经是最小的了。
由于这个AverageOfChildren聚合方式只是针对时间维度的,不能满足大量的应用场景,因此通常我们都需要自己定义这样一个求平均值的计算指标。公式很简单:
平均值=总值 / 维度成员个数
例如我们想看月利润平均值,那么首先我们定义一个“总利润”的指标,那么
月利润平均值 = 总利润 / Count([Time].[CalendarMonth].children)
来源:Kevin Yang