Как запросить 3-месячное скользящее среднее из многомерного куба SSAS (MDX) для каждой даты?

У меня есть многомерный куб SSAS, и мне нужно запросить среднее значение за 3 месяца для каждого дня в диапазоне дат.

Например, для 2016-04-25 я должен получить данные с 2016-01-01 по 2016-03-31. Поэтому я не могу использовать этот запрос (потому что я не знаю, сколько дней я должен отставать до предыдущего месяца):

WITH MEMBER [Measures].[SalesAmount 3m average] AS
(
SUM(
    ([Date].[Date].CurrentMember.Lag(90) :
    ([Date].[Date].CurrentMember.Lag(1),
    [Measures].[SalesAmount]
    )
)

Я предполагаю, что мне нужно использовать функцию Ancestor, чтобы получить месяц и использовать лаг для детализации месяца.

Хорошо, давайте попробуем это:

WITH MEMBER [Measures].[SalesAmount 3m average] AS
(
SUM(
    (Ancestor ( [Date].[Date].CurrentMember, [Date].[Month] )).Lag(3) :
    (Ancestor ( [Date].[Date].CurrentMember, [Date].[Month] )).Lag(1),
    [Measures].[SalesAmount]
    )
)
SELECT { [Measures].[SalesAmount 3m average] } ON Columns,
{ [Date].[Date].&[2016-01-01T00:00:00] : [Date].[Date].&[2016-02-28T00:00:00]} On Rows
FROM [Cube]

К сожалению, этот запрос не работает должным образом (возвращает ноль).

Как решить эту проблему?

ОБНОВЛЕНО: Хорошо, я попытался запросить заголовок члена:

MEMBER [Measures].[Test] AS
(
(Ancestor 
    (   [Date].[Date].CurrentMember, 
        [Date].[Date].[Month] )
    ).Item(0).Member_Caption
)

И я получаю не заголовок месяца, а дату (день) - ту же дату, что и [Дата]. [Дата].CurrentMember.

Тогда я попробовал это запросы:

--First try
MEMBER [Measures].[Test] AS
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Month].&[2016-05-01T00:00:00])
) 

--Second try
MEMBER [Measures].[Test] AS
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Date].[Month].&[2016-05-01T00:00:00])
) 

--Third try
MEMBER [Measures].[Test] AS
(
IsAncestor([Date].[Date].CurrentMember, [Date].[Year -  Quarter -  Month -  Date].[Month].&[2016-05-01T00:00:00])
) 

Во всех запросах результат был "Ложь". Итак, член Месяца не предок на сегодняшний день участников??? Теперь я действительно запутался.

Измерение "Моя дата" выглядит следующим образом:

ОБНОВЛЕНИЕ 2:

MEMBER [Measures].[Test] AS
(
(Ancestor 
    (   [Date].[Date].CurrentMember, 
        1 )
    ).Member_Caption
)

Возвращает: Все

1 ответ

Решение

Ваш код кажется в порядке. Я бы добавил элемент (0) в нескольких местах, чтобы сделать вещи более очевидными, но это не должно сильно изменить

WITH 
  MEMBER [Measures].[SalesAmount 3m average] AS 
    Sum
    (
        Ancestor
        (
          [Date].[Calendar].CurrentMember
         ,[Date].[Calendar].[Month]
        ).Item(0).Lag(3)
      : 
        Ancestor
        (
          [Date].[Calendar].CurrentMember
         ,[Date].[Calendar].[Month]
        ).Item(0).Lag(1)
     ,[Measures].[Internet Sales Amount]
    ) 
SELECT 
  {[Measures].[SalesAmount 3m average]} ON COLUMNS
 ,{
      [Date].[Calendar].[Date].&[20060222]
    : 
      [Date].[Calendar].[Date].&[20060722]
  } ON ROWS
FROM [Adventure Works];

Возвращает это:

Проверьте правильность всех ваших выражений уровня:

[Date].[Date] ?

а также

[Date].[Month] ?

Также в качестве дальнейшего теста, что это возвращает?

WITH 
  MEMBER [Measures].[test1] AS 
    Ancestor
    (
      [Date].[Date].CurrentMember
     ,[Date].[Month]
    ).Item(0).Lag(3).Member_Caption 
  MEMBER [Measures].[test2] AS 
    Ancestor
    (
      [Date].[Date].CurrentMember
     ,[Date].[Month]
    ).Item(0).Lag(1).Member_Caption 
SELECT 
  {
    [Measures].[test1]
   ,[Measures].[test2]
  } ON COLUMNS
 ,{
      [Date].[Date].&[2016-01-01T00:00:00]
    : 
      [Date].[Date].&[2016-02-28T00:00:00]
  } ON ROWS
FROM [Cube];

Предок будет функционировать между различными уровнями одной и той же иерархии, то есть:

Это значит, что [Date].[Date] а также [Date].[Month] на самом деле не связаны через предка. Попробуй это:

WITH 
MEMBER [Measures].[SalesAmount 3m average] AS
  (
    SUM(
      Ancestor ( 
         [Date].[Year -  Quarter -  Month -  Date].CurrentMember,
         [Date].[Year -  Quarter -  Month -  Date].[Month] ).Lag(3) 
       :
      Ancestor( 
         [Date].[Year -  Quarter -  Month -  Date].CurrentMember
        ,[Date].[Year -  Quarter -  Month -  Date].[Month] ).Lag(1)
      ,[Measures].[SalesAmount]
    )
  )
SELECT 
{ [Measures].[SalesAmount 3m average] } ON Columns,
{ 
  [Date].[Year -  Quarter -  Month -  Date].[Date].&[2016-01-01T00:00:00] 
: [Date].[Year -  Quarter -  Month -  Date].[Date].&[2016-02-28T00:00:00]
//I suspect the above 2 lines can be replaced by following:
//  [Date].[Date].&[2016-01-01T00:00:00]
//: [Date].[Date].&[2016-02-28T00:00:00]
}  
  On Rows
FROM [Cube];

нота

Это должно вернуться All потому что иерархия [Date].[Date] только имеет два уровня... конечный уровень - это даты с одним уровнем выше, чем All:

MEMBER [Measures].[Test] AS
(
(Ancestor 
    (   [Date].[Date].CurrentMember, 
        1 )
    ).Member_Caption
)
Другие вопросы по тегам