MDX 如何在报告中创建方差和方差百分比

MDX How do you create a variance and variance % in a report

使用 AdventureWorksDW2008R 我有以下数据集

SELECT NON EMPTY { 
[Measures].[Sales Amount], [Measures].[Total Product Cost], [Measures].[Internet Sales Count] 
} ON COLUMNS, NON EMPTY 
{ 
([Order Date].[Calendar Year].[Calendar Year].ALLMEMBERS ) 
} DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS 
FROM [Adventure Works Cube]

结果是:

         Sales Amount          Total Product Cost       Internet Sales Count
2005     4342674.0296          2562584.6235             8949
2008     25016003.1911002      14715208.9522001         51449

有没有办法计算报告中每个的方差?

例如,Internet 销售计数的方差为: 51449 – 8949 = 42500

方差百分比为 42500/51449 = 83%

我知道我可以使用以下方法求和:

=Sum(Fields!Internet_Sales_Count.Value, "DataSet1")

有没有办法得到 2008 年的值并减去 2005 年的值?

这是一种可能性:

WITH 
  MEMBER [Measures].[Internet Sales diff] AS 
      (
        [Delivery Date].[Calendar Year].CurrentMember
       ,[Measures].[Internet Sales Amount]
      )
    - 
      (
        [Delivery Date].[Calendar Year].CurrentMember.Lag(1)
       ,[Measures].[Internet Sales Amount]
      ), format_string = '#,###,###,##0.00' 
SELECT 
  NON EMPTY 
    {
      [Measures].[Sales Amount]
     ,[Measures].[Total Product Cost]
     ,[Measures].[Internet Sales Amount]
     ,[Measures].[Internet Sales diff]
    } ON COLUMNS
 ,NON EMPTY 
    {[Delivery Date].[Calendar Year].[Calendar Year].ALLMEMBERS}
  DIMENSION PROPERTIES 
    MEMBER_CAPTION
   ,MEMBER_UNIQUE_NAME
   ON ROWS
FROM [Adventure Works];

以上结果如下:

然后可以像这样添加百分比度量:

WITH 
  MEMBER [Measures].[Internet Sales diff] AS 
      (
        [Delivery Date].[Calendar Year].CurrentMember
       ,[Measures].[Internet Sales Amount]
      )
    - 
      (
        [Delivery Date].[Calendar Year].CurrentMember.Lag(1)
       ,[Measures].[Internet Sales Amount]
      ) 
   ,format_string = '#,###,###,##0.00' 
  MEMBER [Measures].[Internet Sales diff %] AS 
    IIF
    (
      [Measures].[Internet Sales Amount] = 0
     ,null
     ,
        [Measures].[Internet Sales diff]
      / 
        (
          [Delivery Date].[Calendar Year].CurrentMember.Lag(1)
         ,[Measures].[Internet Sales Amount]
        )
    ) 
   ,format_string = '#,###,###,##0.00%' 
SELECT 
  NON EMPTY 
    {
      [Measures].[Sales Amount]
     ,[Measures].[Total Product Cost]
     ,[Measures].[Internet Sales Amount]
     ,[Measures].[Internet Sales diff]
     ,[Measures].[Internet Sales diff %]
    } ON COLUMNS
 ,NON EMPTY 
    {[Delivery Date].[Calendar Year].[Calendar Year].ALLMEMBERS}
  DIMENSION PROPERTIES 
    MEMBER_CAPTION
   ,MEMBER_UNIQUE_NAME
   ON ROWS
FROM [Adventure Works];

结果:


下面是使用 parallelperiod 函数的更好方法:

WITH 
  MEMBER [Measures].[Internet Sales PrevYr] AS 
    IIF
    (
      [Measures].[Internet Sales Amount] = 0
     ,null
     ,(
        [Measures].[Internet Sales Amount]
       ,ParallelPeriod
        (
          [Delivery Date].[Calendar Year].[Calendar Year]
         ,1
         ,[Delivery Date].[Calendar Year].CurrentMember
        )
      )
    ) 
   ,format_string = '$#,###,###,##0.00' 
  MEMBER [Measures].[Internet Sales diff] AS 
    IIF
    (
      [Measures].[Internet Sales Amount] = 0
     ,null
     ,
      [Measures].[Internet Sales Amount] - [Measures].[Internet Sales PrevYr]
    ) 
   ,format_string = '$#,###,###,##0.00' 
  MEMBER [Measures].[Internet Sales diff %] AS 
    IIF
    (
      [Measures].[Internet Sales PrevYr] = 0
     ,null
     ,
      [Measures].[Internet Sales diff] / [Measures].[Internet Sales PrevYr]
    ) 
   ,format_string = '#,###,###,##0.00%' 
SELECT 
  NON EMPTY 
    {
      [Measures].[Internet Sales Amount]
     ,[Measures].[Internet Sales PrevYr]
     ,[Measures].[Internet Sales diff]
     ,[Measures].[Internet Sales diff %]
    } ON COLUMNS
 ,NON EMPTY 
    {[Delivery Date].[Calendar Year].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works];

结果: