【问题标题】:OLAP Cube Calculation for Last Year Comparison on Week Day - MDX去年工作日比较的 OLAP 多维数据集计算 - MDX
【发布时间】:2020-05-15 03:15:50
【问题描述】:

我想将实际销售价值与去年的销售价值进行比较。这种比较的困难在于是否符合工作日以及闰年。

日级别示例:

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 年结果:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: mdx olap olap-cube calculation mdx-query


    【解决方案1】:

    我得到了解决方案:

    这个问题的立方体计算代码:

    // ------------------------------------------------------------------------
    //
    //    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;   
    

    现在每个级别的总和值:

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

    【讨论】:

      【解决方案2】:

      只是试图将问题模仿为 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;  
      

      【讨论】:

        【解决方案3】:

        不完全回答问题,但在以下上下文中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):

        【讨论】:

        • 谢谢。当我使用与上一年比较的并行期时,它技术适用于您发布的所有级别。问题是您将 2013-01-01 与 2012-01-01 进行比较,所以周二与周日。我的目标是将星期二与星期二进行比较,因此 2013-01-01 与 2012-01-03。
        • 所以“2013-01-01”和“2012-01-03”在日级别。在月级别上,我想将“2013-01-01 - 2013-01-31”与“2012-01-03 - 2012-02-02”进行比较。在年份级别“2013-01-01 - 2013-12-31”和“2012-01-03 - 2013-01-01”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        相关资源
        最近更新 更多