MDX-запрос: Как сравнить данные за текущий год текущего года с данными за предыдущий год? - PullRequest
0 голосов
/ 17 августа 2011

С помощью приведенных ниже запросов MDX я пытаюсь вернуть сравнение показателей продаж.

Я хочу сравнить YTD с LYTD, определенным следующим образом:

YTD: 01 января этого года (01 января 2011 года) до сегодняшнего дня (17 августа 2011 года)

LYTD: 01 января прошлого года (01 января 2010 года) до сегодняшней даты прошлого года (17 августа 2010 года)

Оба периода должны содержать одинаковое количество дней (для високосных лет - один или один день).

До сих пор я пытался использовать функцию YTD () для получения данных за этот год, но у меня было немногоуспех с упаковкой функции YTD () во что-то, чтобы она возвращала те же даты, что и в прошлом году.Я использовал LAG (1) и ParallelPeriod (см. Оба примера ниже):

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM((YTD(),[Measures].[Sales]).LAG(1))'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

или

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(ParallelPeriod(YTD(),1),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

Полученные данные при использовании ParallelPeriod или LAG всегда возвращают столбец с нулевыми значениямидля прошлогодних продаж:

Customer    Sales YTD  Sales LYTD
ABC Screws      $1024       (Null)
ABC Bolts       $2392       (Null)
ABC Nuts        $3735       (Null)

Кто-нибудь может предложить изменения в запросе, которые будут возвращать правильные данные, или, возможно, предложить альтернативную стратегию использования LAG или ParallelPeriod?

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

Вскоре после публикации вопроса и дальнейших экспериментов следующая конструкция, казалось, вернула результаты, которые я искал:

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(YTD(ParallelPeriod([Time].[Year],1,[Time].CURRENTMEMBER)),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

Я бы отправил свой ответ вчера вечером, но пользователям, набравшим менее 100 баллов, нужно подождать 8 часов, прежде чем они смогут ответить на свои вопросы.

@ Макс. Спасибо за ваш вклад, похоже, у вас была такая же идея. Поэтому вы получите принятый ответ, хотя я использую свой собственный для реализации.

0 голосов
/ 17 августа 2011

используйте что-то подобное:

WITH
        MEMBER [Measures].[Sales YTD] AS
            'SUM(YTD(closingperiod([Date].[Calendar].[Date])),[Measures].[Sales])'
        MEMBER [Measures].[Sales LYTD] AS
            'SUM(YTD(PARALLELPERIOD([Date].[Calendar].[Calendar Year],1,closingperiod([Date].[Calendar].[Date]))),[Measures].[Sales])'
        SELECT
            {[Measures].[Sales YTD],[Measures].[Sales LYTD]} ON COLUMNS
        ...

, где

  • [Дата]. [Календарь]. [Дата] - уровень «День» в измерении «Дата»;
  • Closingperiod ([Дата]. [Календарь]. [Дата]) - последний член этого уровня «День» (17 августа 2011 года);
  • [Дата]. [Календарь].[Calendar Year] - уровень "Year" в измерении Date;
  • PARALLELPERIOD ([Date]. [Calendar]. [Calendar Year], 1, заключительный период ([Date]. [Calendar]. [Date]).)) - 17 августа 2010 года.
...