Как запросить 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
)