SSAS度量值属性AggregateFunction的使用
SSAS度量值属性AggregateFunction的使用
聚合函数
ssas 提供了12种函数,用来针对包含在度量值组中的维度聚合度量值。默认情况下,度量值按每个维度进行求和。但是,通过 AggregateFunction 属性,您可以修改此行为。聚合函数的累加性可确定度量值如何在多维数据集的所有维度中进行聚合。
聚合函数具有三个级别的累加性:
累加性:累加性度量值也称为完全累加性度量值,可针对包含度量值的度量值组中包括的所有维度进行聚合,没有任何限制。
半累加性:半累加性度量值可针对包含度量值的度量值组中包括的某些(但不是全部)维度进行聚合。例如,表示可供库存数量的度量值可针对地域维度进行聚合,以生成可用于所有仓库的总计数量,但该度量值不能针对时间维度进行聚合,因为该度量值表示可用数量的定期快照。针对时间维度聚合此类度量值将产生不正确的结果。
非累加性:非累加性度量值不能针对包含度量值的度量值组中的任何维度进行聚合。相反,必须对表示度量值的多维数据集中的每个单元分别计算度量值。例如,返回百分比的计算度量值(例如利润率)不能由任何维度内子成员的百分比值进行聚合。
下表列出了 Analysis Services 中的聚合函数,并对函数的累加性和预期输出进行了说明。
聚合函数 累加性 返回值
Sum 累加性 对所有子成员的值求和。这是默认的聚合函数。
Count 累加性 检索所有子成员的计数。
Min 半累加性 检索所有子成员的最低值。
Max 半累加性 检索所有子成员的最高值。
DistinctCount 非累加性 检索所有唯一子成员的计数。
None 非累加性 不执行任何聚合,直接从事实数据表中为包含度量值的度量值组提供维度中叶成员和非叶成员的所有值。
如果从事实数据表中无法为成员读取任何值,则该成员的值设置为空。不汇总,值等于叶单元值
ByAccount 半累加性 根据为帐户维度中某一成员的帐户类型指定的聚合函数计算聚合。如果度量值组中不存在任何帐户类型维度,
则视为 None 聚合函数。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是由ACCOUNT维度的当前成员指定.
FirstChild 半累加性 检索第一个子成员的值。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是 第一个 后代值.
LastChild 半累加性 检索最后一个子成员的值。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是 最后一个 后代值.
FirstNonEmpty 半累加性 检索第一个非空子成员的值。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是 第一个非空 后代值.
LastNonEmpty 半累加性 检索最后一个非空子成员的值。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是 最后一个非空 后代值.
AverageOfChildren 半累加性 计算所有非空子成员的平均值。除对TIMER维以外的所有维度 SUM 聚合.TIMER维的聚合值是后代值的平均值.
不同的版本 使用的累加性功能不一样哦。比如标准版就不能用非累加性的属性哦。
比如:Min的用法
Id OrgLevel OrgName ParentId
172 3 重庆华轻 179
173 4 苏州宝捷 165
174 4 濮阳华宝商贸 134
175 5 六盘水分部 179
176 5 仁怀分部 178
Q:通过上表,求度量值OrgLevel的值
A:在ssas中,我们把OrgLevel的AggregateFunction属性设为Min即可得到
可以用图比较:
BI项目中,我们经常需要设计“平均值”这样的指标,例如电子商务中的平均销售额,Web分析中的平均访问时长,等等。而ssas中提供了一个“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)
--*******************************************************************************
--*******************************************************************************
下图是度量值AggregateFunction的选项:
下图是度量值FormatString的选项:
参考网页:http://msdn.microsoft.com/zh-cn/library/ms175623.aspx#AggFunction