代码改变世界

MDX Cookbook 11 - 计算 Year Over Year 增长 (同比计算) ParallelPeriod

2013-12-05 22:32  BIWORK  阅读(4107)  评论(2编辑  收藏  举报

这一小节主要介绍如何在一个平行期间的度量值,当前值的对比对象是指当前值的上一年,上一个季度或者其它时间级别上与当前值同一时间点上的的那个对象。有一个非常常见的需求就是对比上一年同一个时间点的某个值来判断在现在同期的时候这个值的大小是上升了还是下降了。

先显示基于月份成员的销售额情况 -

使用 PARALLELEPRIOD(Level, N, Member) 先把同比值查询出来,Level 指定的是年,1 表示 1年前,Member 就是指当前成员并且表示月。所以整个表达的意思就是查询当前成员1年前的相对应的那个月的 Reseller Sales Amount 的值是多少。

WITH
MEMBER [Measures].[Reseller Sales PP]
AS
(
   PARALLELPERIOD(
      [Date].[Fiscal].[Fiscal Year],
      1,
      [Date].[Fiscal].CurrentMember
    ),
   [Measures].[Reseller Sales Amount]
),FORMAT = "Currency"
SELECT {
     [Measures].[Reseller Sales Amount],
     [Measures].[Reseller Sales PP]
} ON 0,
{[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]

由于 2005年之前没有数据,因此就没有上一年的对比,但是从 2006年开始就有对应的对象了。

全部查询出来,包括上一个同期的对象,PP 值以及同比率。

WITH
MEMBER [Measures].[Member PP Name]
AS
    PARALLELPERIOD(
                               [Date].[Fiscal].[Fiscal Year],
                               1,
                               [Date].[Fiscal].CurrentMember
                             ).NAME
MEMBER [Measures].[Reseller Sales PP]
AS
(
   PARALLELPERIOD(
                              [Date].[Fiscal].[Fiscal Year],
                              1,
                              [Date].[Fiscal].CurrentMember
                            ),
    [Measures].[Reseller Sales Amount]
),FORMAT = "Currency"
MEMBER [Measures].[Reseller Sales YoY%]
AS
 IIF(
         [Measures].[Reseller Sales PP] = 0,
         NULL,
         [Measures].[Reseller Sales Amount]/[Measures].[Reseller Sales PP]
       )
,FORMAT = "PERCENT"
SELECT {
                 [Measures].[Reseller Sales Amount],
                 [Measures].[Member PP Name],
                 [Measures].[Reseller Sales PP],
                 [Measures].[Reseller Sales YoY%]
} ON 0,
{[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]

查询结果 -

其实 PARALLELPERIOD() 函数不光可以用在时间层次结构上,同样它也可以用在其它非时间层次结构中,比如这段代码 - [CA]&[US] 这个州成员在国家这个级别上将自己所在国家成员往前移动两个位置下的同等位置的州成员的销售额。

SELECT {[Measures].[Reseller Sales Amount]} ON 0,
{
    ParallelPeriod(
                        [Geography].[Geography].[Country],
                        2,
                        [Geography].[Geography].[State-Province].&[CA]&[US]
                        )
} ON 1
FROM [Adventure Works]

先来看国家, United States 的前两个位置的成员是 Germany。

California 在 US 下的位置 和 Hamburg 在 Germany 下的位置也是一致的。

关于 PARALLELPERIOD() 函数的使用,我的这篇 MDX 读书笔记中有详细的解释 - MDX Step by Step 读书笔记(九) - Working with Time 处理时间

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)