OLAP 多维数据集计算去年工作日比较 - MDX

OLAP Cube Calculation for Last Year Comparison on Week Day - MDX

我想将实际销售额与去年的销售额进行比较。这种比较的难点在于工作日和闰年的合规性。

日级示例:

2016-02-04(星期四):实际销量:580,- 去年销量:1.008,-

比较

2015-02-05(星期四):实际销量:1.008,-

所以我想比较一个月中的同一周,而不仅仅是相同的日期。

月级示例:

2016 年:(闰年) 01.02.2016 - 29.02.2019(2016 年 2 月)实际销售额:19.300,-:去年销售额:19.000,-

比较

2015 年:(无闰年) 02.02.2015 - 02.03.2015(2015 年 2 月逻辑上的工作日)实际销售额:19.000,-

我不仅要将 2016 年 2 月与 2015 年 2 月进行比较,还要准确比较工作日的销售额总和。

我尝试使用日期计算维度来编写此计算,它有效,但仅适用于日级别。计算维度名称:Date Calculations Week Day 成员名称:ComparisonWD

SCOPE ( 
    [Date].[Year - Quarter - Month - Date].MEMBERS,
    [Date].[Date].MEMBERS );                    


( [Date Calculations Week Day].[ComparisonWD].[Previous Year], 
      [Date Calculations Week Day].[AggregationWD].Members ) 
          = ( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
              ParallelPeriod( [Date].[Year - Quarter - Month - Date].[Date],
                              364,
                              [Date].[Year - Quarter - Month - Date].CurrentMember ) );            
END SCOPE;

2015 年成绩:

2016 年成绩:

它适用于日级别,但正如您所见,不适用于月级别和年级别。

我怎样才能做到这一点?

没有完全回答问题,但在以下上下文中 PARALLELPERIOD 似乎很笼统:

1。 在月份级别:

WITH 
  MEMBER [Measures].[PY Internet Sales Amount] AS 
    (
      ParallelPeriod
      (
        [Date].[Calendar].[Calendar Year]
       ,1
       ,[Date].[Calendar].CurrentMember
      )
     ,[Measures].[Internet Sales Amount]
    ) 
SELECT 
  {
    [Measures].[Internet Sales Amount]
   ,[Measures].[PY Internet Sales Amount]
  } ON 0
 ,{
      //[Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
      [Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
  } ON 1
FROM [Adventure Works];

给出这个:

2。 更改为日期级别但 PARALLELPERIOD 计算保持不变:

WITH 
  MEMBER [Measures].[PY Internet Sales Amount] AS 
    (
      ParallelPeriod
      (
        [Date].[Calendar].[Calendar Year]
       ,1
       ,[Date].[Calendar].CurrentMember
      )
     ,[Measures].[Internet Sales Amount]
    ) 
SELECT 
  {
    [Measures].[Internet Sales Amount]
   ,[Measures].[PY Internet Sales Amount]
  } ON 0
 ,{
      [Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
      //[Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
  } ON 1
FROM [Adventure Works];

给出这些结果(无 NULLS):

刚刚尝试将问题模拟为 ssms 中的 mdx 查询并且它有效。我如何应用到我的多维数据集计算:

with 
 set [DateRange] as ( { ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 
                        364, 
                        Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item(0)
                         ) :
                        Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 
                        364,  
                        Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants( 
                                                                                                                                                    [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))})


Select  { 
          [Measures].[Turnover] 
       } on Columns, 
non empty
       (
         [DateRange]
       ) on Rows
from [Sales Cube] 

结果如下:

Turnover Net
03.01.2012  642
04.01.2012  665
05.01.2012  633
06.01.2012  730
07.01.2012  761
08.01.2012  531
09.01.2012  422
10.01.2012  488
11.01.2012  518
.
.
.
23.12.2012  618
24.12.2012  174
25.12.2012  137
26.12.2012  536
27.12.2012  981
28.12.2012  1.052
29.12.2012  1.006
30.12.2012  847
31.12.2012  695
01.01.2013  572

所以你看,日期范围是正确的 2012-01-03 - 2013-01-01

在查询中,我获取日期并将其后代到最低级别(天),然后生成一个日期范围。范围的第一个日期 - 364 天和范围的最后一个日期 -364 天以获得正确的日期范围。不幸的是,我在立方体计算中不起作用:

// ------------------------------------------------------------------------
//
//    Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE ( 
    [Date].[Year - Quarter - Month - Date].MEMBERS,
    [Date].[Date].MEMBERS );                    

    ///////////////////////////////////////////////////////////////////////////////////////
    ( [Date Calculations Week Day].[ComparisonWD].[Previous Year], 
      [Date Calculations Week Day].[AggregationWD].Members ) 
          = SUM( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
              {ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item(0)) :
                     Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364,  Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date])).Count - 1))} );            
END SCOPE;  

我得到了解决方案:

本题的立方体计算代码:

// ------------------------------------------------------------------------
//
//    Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE ( 
    [Date].[Year - Quarter - Month - Date].MEMBERS,
    [Date].[Date].MEMBERS );                    

    ///////////////////////////////////////////////////////////////////////////////////////
    ( [Date Calculations Week Day].[ComparisonWD].[Previous Year], 
      [Date Calculations Week Day].[AggregationWD].Members ) 
          = SUM({ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date]).item(0)) :
                     Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364,  Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))}, [Date Calculations Week Day].[ComparisonWD].DefaultMember );            
END SCOPE;    


SCOPE ([Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year]);                   
    THIS = IIF( IsEmpty( [Date Calculations Week Day].[ComparisonWD].DefaultMember ) 
                         OR IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Previous Year] ),
                NULL,
                [Date Calculations Week Day].[ComparisonWD].DefaultMember 
                - [Date Calculations Week Day].[ComparisonWD].[Previous Year] );                   
    NON_EMPTY_BEHAVIOR(THIS) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;                   
    FORE_COLOR(THIS) = IIF( [Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year] < 0, 255, 0);                     // 255 = RED
END SCOPE;                   

SCOPE ([Date Calculations Week Day].[ComparisonWD].[Diff. % Over Previous Year]);                   
    THIS = IIF( IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year] ) 
                         OR IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Previous Year] ),
                NULL,
                [Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year]
                / [Date Calculations Week Day].[ComparisonWD].[Previous Year] );                   
    NON_EMPTY_BEHAVIOR(THIS) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;                   
    FORMAT_STRING(THIS) = 'Percent';                   
    FORE_COLOR(THIS) = IIF( [Date Calculations Week Day].[ComparisonWD].[Diff. % Over Previous Year] < 0, 255, 0);                     // 255 = RED
END SCOPE;                   

///////////////
// Tuple (All years, All Months) is the default number (keeps compatibility with OWC11)
( [Date].[Year].[All], [Date].[MonthYear].[All],
  Except( [Date Calculations Week Day].[ComparisonWD].[ComparisonWD].MEMBERS, [Date Calculations Week Day].[ComparisonWD].DefaultMember ) ) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;   

现在每个级别都有求和值:

使用此日期计算工作日维度,您可以在工作日逻辑上为每个度量显示上一年的值。