今天做项目分析数据的时候,需要将一个维度的数据加总,类似于SQL中的SUM,这样就不需要在程序中进行计算加总,而是在数据库端就可以得到计算结果,大大减少系统的计算量。

首先请看如下图示的目标数据:

彭智勇-Aggregate用法

如上图示,笔者需要将09/02、09/03到09/12方向(假设时间维度为DimTimeY.[Month].Y)的数据相加,加总后的列命名为2009,然后再将12/01、12/02、到12/09方向(假设时间维度为DimTimeX.[Month].X)的数据相加,加总后的列命名为Total,达到如下图所示的效果:

彭智勇-Aggregate用法

如图才能完成如上所示的效果呢?这里用到了聚合函数Aggregate(set, [,numeric value expression]),下面简单说明一下Aggregate基本概念与用法。

这个函数根据上下文中各度量的默认聚合运算符来聚合由集形成的单元。如果提供了numeric value expression,那么函数对集中每个单元应用该表达式之后进行求和。在单元来自基度量时,将会采用该度量上指定的聚合函数。在AS2000中,如果度量的聚合函数是COUNT、MIN和MAX,将分别采用它们作为聚合函数。在其它情况下,采用的聚合操作是求和。在AS2005中,Aggregate()函数可以正常工作的固有度量聚合函数比较多,具体包括:Sum、AverageOfChildren、ByAccount、Count、FirstChild、FirstNonEmpty、LastChild、LastNonEmpty、Max、Min、DistinctCount、Aggregate(),但是,Aggregate()函数不会对那些聚合函数为None的度量进行聚合操作。

PS:尽管可以指定一个表示式来使用该函数进行计算,但如果使用计算成员作为其输入,该函数就无法正常工作(如果一个计算成员“M"比另一个维度之上正在执行Aggregate()的某个计算成员拥有较高的SOLVE_ORDER,那么“M”将会采用聚合成员的结果,否则将出现不可预测的值)。

当操作一组均被查询的不同度量且其聚合规则不尽相同时,使用该函数往往比较方便。执行时段到日期聚合以及其他维度聚合的计算成员经常构造巧妙,一般都使用该运算符。如上实例需求中(纵向相加求和),我们利用该函数有下面的计算成员:

WITH MEMBER [DimTimeY].[Month].[2009]
AS AGGREGATE([DimTimeY].[Month].[09/02]:[DimTimeY].[Month].[09/12])

当与求和度量结合时,该成员将会给出在09/02到09/12范围内值的和。当与由MAX聚合的度量结合时,该成员将会给出在相同时间段内其值的最大值。显然笔者要达到的效果是前者(即求和)。于是就可以将该计算成员在相应的位置调用,完成相应的计算。

对于DimTimeX方向的求和,同理有计算成员:

WITH MEMBER [DimTimeX].[Month].[Total]
AS AGGREGATE([DimTimeX].[Month].[12/01]:[DimTimeX].[Month].[12/09])

然后于相应位置调用该计算成员,即获取图示需求结果(红色线框标注部分),从而达到笔者需要。

空非易文章均为原创,转载请以链接形式注明本文地址

本文地址:http://pengzhiyong.com/archives/mdx-aggregate.html

作者:空非易 | 标签: , | 浏览:1554