首页 > 解决方案 > 去年工作日比较的 OLAP 多维数据集计算 - 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 年结果:

在此处输入图像描述

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

在此处输入图像描述

我怎样才能做到这一点?

标签: mdxolapolap-cubecalculationmdx-query

解决方案


我得到了解决方案:

此问题的立方计算代码:

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

现在每个级别的总和值:

在此处输入图像描述

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


推荐阅读