同比和环比计算是企业应用、电子商务应用中常用的计算方法,也是常用的数据分析手段。写这篇文章也是因为最近在学习MDX相关的一些计算方法的同时回想到原来我在项目中使用过的一些类似的,利用SQL来完成的统计计算,如前期和当期的差额,趋势等。比较之下,利用MDX来完成这些计算比用SQL来做要简单清晰得多,当然这是毫无疑问的。原来利用几十行甚至上百行SQL来完成的计算(有时还要借助程序代码来完成计算)现在用MDX只要十几行左右就可以完成。因此,MDX所带来的好处是很明显的。本文就主要介绍利用MDX进行同比和环比计算。
现在进入正题,我首先介绍一下本文使用到的多维数据集(在说明MDX查询之前对多维数据集作一些介绍有利于理解)。本文中用到的多维数据集是通过SQL SERVER 2005提供的案例数据仓库AdventureWorksDW创建的。多维数据集的名称是AW Cube。本文介绍的同比和环比查询所涉及到的维度包括[Ship Date](时间维度)和名称为[Sales Amount]的度量值。因为是一个用于学习的案例,所以结构比较简单,可以通过适当地修改MDX查询(如进行切片、切块、下钻、上卷操作)来达到实际使用目的。
在时间维度中包括两个层次:[Ship Date].[h_TimeYSQMD];[Ship Date].[h_TimeYWM]。本文主要用到的是前者。这个层次结构为:CalendarYear->CalendarSemester->CalendarQuarter->MonthNumberOfYear-> DayNumberOfMonth。
接下来再说明一下什么是环比及同比。简单地说,环比就是逐期的数据比较;同比就是同期的数据比较。例如:将今年的下半年数据与上半年数据相比较;将今年的五月的数据与四月的数据相比较;将今年第三季度的数据与今年的第二季度相比较,这些都是环比。将今年的数据与去年的数据比较;将今年五月的数据与去年五月的数据比较;将今年第一季度的数据与去年第一季度的数据比较,这些都是同比。
同比的MDX代码如下(计算成员):
CREATE MEMBER [AW Cube].[Parallel Period Compare] AS
[Measures].[Sales Amount]-(
[Measures].[Sales Amount],ParallelPeriod(
[Ship Date].[h_TimeYSQMD].[CalendarYear],
1,
[Ship Date].[h_TimeYSQMD].CurrentMember
)
),
FORMAT_STRING='###,###,###,##0.00'
在这个计算成员中最为主要的就是那个ParallelPeriod函数,这个函数的功能是返回上一期间中与指定成员具有相同的相对位置的成员。这里将ParallelPeriod函数的结果与度量值组成一个元组,就可以对ParallelPeriod函数计算所得到的结果在指定的度量上进行汇总。这个计算的结果就是返回当期与上一期数据的差额。
同比计算成员的测试MDX代码:
SELECT
{
[Ship Date].[h_TimeYSQMD].[CalendarYear].&[2003].&[2],
[Ship Date].[h_TimeYSQMD].[CalendarYear].&[2003].&[2].Children
} ON COLUMNS,
{
[Measures].[Sales Amount],
[Parallel Period Compare]
} ON ROWS
FROM [AW Cube]
这个查询用于测试上面的同比计算成员。这个查询的目的是显示2003年下半年与2002年下半年的差额以及2003年第三、四季度与前一年三、四季度的差额。SSAS中的查询结果见图一,第一列(列名为2这一列)第一行(Sales Amount这一行)对应的数据是2003年下半年的销售数据,第一列第二行显示的是与2002年下半年的差额,第二列第一行是2003年第三季度的销售数据,第二列第二行是显示的2003年第三季度与2002年第三季度的差额...
图一:同比查询结果
环比计算成员:
CREATE MEMBER [AW Cube].[Cycle Period Compare] AS
[Measures].[Sales Amount]-(
[Ship Date].[h_TimeYSQMD].CurrentMember.PrevMember,
[Measures].[Sales Amount]
),
FORMAT_STRING='###,###,###,##0.00'
环比计算成员的定义看起来要比同比计算成员简单一点,环比计算成员中最主要的部分就是[Ship Date].[h_TimeYSQMD].CurrentMember.PrevMember这一句。这一句就表达了环比的定义。通过计算当期与前一期成员与度量值组成的汇总数据得到环比结果,即当期与前一期数据的差额。
环比计算成员的测试MDX代码:
SELECT
{
[Ship Date].[h_TimeYSQMD].[CalendarYear].&[2003].&[2],
[Ship Date].[h_TimeYSQMD].[CalendarYear].&[2003].&[2].Children
} ON COLUMNS,
{
[Measures].[Sales Amount],
[Cycle Period Compare]
} ON ROWS
FROM [AW Cube]
这个查询用于测试上面的环比计算成员。这个查询可以显示2003年下半年与上半年的差额以及2003年三季度与二季度的差额、四季度与三季度的差额。查询的结果见图二,第一列(列名为2这一列)第一行(Sales Amount这一行)对应的数据是2003年下半年的销售数据,第一列第二行对应的数据是与上半年的差额。第二列第一行是2003年三季度的销售数据,下面一行是与第二季度的差额...
图二:环比查询结果