MDX-запрос - YTD дает неверный результат из-за того, где - PullRequest
2 голосов
/ 18 апреля 2019

Я хочу вернуть значения YTD (т.е. январь к текущему периоду) для ряда периодов (например, с марта 2012 года по январь 2013 года). Однако понятно, что когда я применяю условие where, чтобы ограничить его «мар 2012 - январь 2013», мы теряем значения января и февраля с начала года. Ниже приведен пример кода:

WITH 
  MEMBER [Measures].[Last Day of Month] AS 
    TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
  MEMBER [Measures].[Calculate YTD] AS 
    Sum
    (
      periodstodate(
        [Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
      )
     ,[Measures].[Internet Total Sales]
    ) 
SELECT 
  { 
   [Measures].[Last Day of Month]
   ,[Measures].[Internet Total Sales]
   ,[Measures].[Calculate YTD]
  } ON COLUMNS,
  [Date].[Calendar].[Month] 
  ON ROWS
FROM [Adventure Works Internet Sales Model]
WHERE 
(
 [Date].[Date].&[2012-03-01T00:00:00]:
 [Date].[Date].&[2013-01-01T00:00:00]
);

Результат вышеприведенного запроса с неверной YTD:

3-Mar   $373,483.01

4-Apr   $773,818.62

5-May   $1,132,696.51

6-Jun   $1,687,856.65

7-Jul   $2,132,414.88

8-Aug   $2,656,332.26

9-Sep   $3,142,509.71

10-Oct  $3,677,669.20

11-Nov  $4,215,624.71

12-Dec  $4,840,126.88

1-Jan   $29,456.25

Значения Я хотел бы, чтобы запрос возвращал (правильные значения YTD):

    Calculate YTD

3-Mar   $1,375,841.32

4-Apr   $1,776,176.93

5-May   $2,135,054.82

6-Jun   $2,690,214.97

7-Jul   $3,134,773.20

8-Aug   $3,658,690.58

9-Sep   $4,144,868.03

10-Oct  $4,680,027.51

11-Nov  $5,217,983.03

12-Dec  $5,842,485.20

1-Jan   $29,456.25

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Не слишком уверен, что любой из этих подходов будет работать, но в любом случае здесь идет ...

Sub-select

WITH 
  MEMBER [Measures].[Last Day of Month] AS 
    TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
  MEMBER [Measures].[Calculate YTD] AS 
    Sum
    (
      periodstodate(
        [Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
      )
     ,[Measures].[Internet Total Sales]
    ) 
SELECT 
  { 
   [Measures].[Last Day of Month]
   ,[Measures].[Internet Total Sales]
   ,[Measures].[Calculate YTD]
  } ON COLUMNS,
  [Date].[Calendar].[Month] 
  ON ROWS
FROM 
( 
SELECT
  [Date].[Date].&[2012-03-01T00:00:00]:
  [Date].[Date].&[2013-01-01T00:00:00] ON 0
FROM [Adventure Works Internet Sales Model] 
);

HAVINGпункт:

WITH 
MEMBER [Measures].[Last Day of Month VALUE] AS 
    TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBERVALUE 

  MEMBER [Measures].[Last Day of Month] AS 
    TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
  MEMBER [Measures].[Calculate YTD] AS 
    Sum
    (
      periodstodate(
        [Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
      )
     ,[Measures].[Internet Total Sales]
    ) 
SELECT 
  { 
   [Measures].[Last Day of Month VALUE]
   ,[Measures].[Last Day of Month]
   ,[Measures].[Internet Total Sales]
   ,[Measures].[Calculate YTD]
  } ON COLUMNS,
  [Date].[Calendar].[Month] 
  HAVING 
    (
      [Measures].[Last Day of Month VALUE] >=CDATE('3/1/2012')   
      AND  [Measures].[Last Day of Month VALUE] <=CDATE('1/1/2013')
    ) 
  ON ROWS
FROM [Adventure Works Internet Sales Model];
0 голосов
/ 18 апреля 2019

Попробуйте использовать функцию YTD. Это даст вам правильный результат с предложением или без него.

(AdventureWorks 2014, YTD для измерения объема продаж через Интернет)

WITH 
  MEMBER [Measures].[Calculate YTD] AS 
   AGGREGATE(YTD(), [Measures].[Internet Sales Amount])
SELECT 
  { 
  [Measures].[Internet Sales Amount]
  ,[Measures].[Calculate YTD]
  } ON COLUMNS,
  [Date].[Calendar].[Month] 
  ON ROWS
FROM [Adventure Works]
WHERE 
(
 [Date].[Date].&[20120301]:
 [Date].[Date].&[20130101]
);

или с PeriodsToDate:

WITH 

   MEMBER [Measures].[Calculate YTD] AS 
    sum
    (
      periodstodate(
       [Date].[Calendar].[Calendar Year],   
            [Date].[Calendar].currentmember
      )
     ,[Measures].[Internet Sales Amount]
    ) 


SELECT 
  { 
  [Measures].[Internet Sales Amount]
  ,[Measures].[Calculate YTD]
  } ON COLUMNS,
  [Date].[Calendar].[Month] 
  ON ROWS
FROM [Adventure Works]
WHERE 
(
 [Date].[Date].&[20120301]:
 [Date].[Date].&[20130101]
);

Оба запроса возвращают одинаковые результаты:

March 2012  $1,375,841.32
April 2012  $1,776,176.93
May 2012    $2,135,054.82
June 2012   $2,690,214.97
July 2012   $3,134,773.20
August 2012 $3,658,690.58
September 2012  $4,144,868.03
October 2012    $4,680,027.51
November 2012   $5,217,983.03
December 2012   $5,842,485.20
January 2013    $857,689.91
...