Расчет куба OLAP для сравнения за последний год в день недели - MDX - PullRequest
1 голос
/ 29 января 2020

Я хочу сравнить фактические значения продаж со значениями продаж прошлого года. Трудность в этом сравнении заключается в соблюдении дней недели и, следовательно, високосного года.

Пример на уровне дня:

2016-02-04 (четверг ): фактические продажи: 580, - прошлогодние продажи: 1,008, -

сравнение с

2015-02-05 (четверг): фактические продажи: 1,008, -

Поэтому я хочу сравнивать одни и те же дни недели в месяце, а не только одни и те же даты.

Пример на уровне месяца:

2016: (високосный год) 01.02 .2016 - 29.02.2019 (февраль 2016) фактические продажи: 19,300, -: прошлый год Объем продаж: 19,000, -

сравнение с

2015: (без високосного года) 02.02.2015 - 02.03.2015 (февраль 2015 года по дням недели c) фактическая стоимость продаж: 19.000, -

Я хочу не только сравнить февраль 2016 года с февралем 2015 года, но и в точности суммировать значения продаж по дням недели.

Я пытался записать это вычисление с измерением вычисления даты, и оно работает, но только на уровне дня. Имя измерения калькуляции: Дата вычислений Неделя Имя дня участника: 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:

enter image description here

Результат 2016:

enter image description here

Работает на уровне дня, но, как вы видели, не на уровне месяца и не на уровне года.

enter image description here

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 31 января 2020

Только что попытался имитировать проблему как запрос mdx в ssms, и это работает. Как я могу применить к моему расчету куба:

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;  
0 голосов
/ 31 января 2020

Я получил решение:

Код расчета куба для этой задачи:

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

Теперь с суммированными значениями на каждом уровне:

enter image description here

С помощью этого расчета даты Измерение дня недели можно отобразить для каждого показателя Предыдущие значения года в логи дня недели c.

0 голосов
/ 30 января 2020

Не совсем отвечает на вопрос, но в следующем контексте PARALLELPERIOD выглядит довольно обобщенно c:

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

Дает это:

enter image description here

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):

enter image description here

...