2015-06-19 6 views
2

у меня есть этот вычисляемый элемент, который вычисляет скользящее среднее за последние 12 месяцев:скользящего среднего из последних 24 месяцев

iif(IsEmpty(Sum({[Time].[Month].CurrentMember:NULL}, 

[Measures].[Count])), NULL, 
Avg 
(
    [Time].[Month].CurrentMember.Lag(11) : 
    [Time].[Month].CurrentMember, 
    [Measures].[Count] 
)) 

условие IIF на месте, потому что я не хочу, чтобы получить значения для будущих месяцев (без значения), который я получаю без него.

То, что я хочу сделать, это измерять только за последние 24 месяца с последнего непустого месяца.

Я пробовал с Tail и Lag, но не повезло (я бы поставил свои попытки здесь, но после многих попыток я удалил их и не знал бы, с чего начать).

Благодаря @whytheq это окончательное решение, которое я использовал:

CREATE DYNAMIC SET CURRENTCUBE.[FirstEmptyMonth] 
AS { Tail 
     (
     NonEmpty 
     (
      [Time].[Month].MEMBERS 
     ,[Measures].[Count] 
     ) 
     ,1 
    ).Item(0).NextMember };   
CREATE DYNAMIC SET CURRENTCUBE.[MonthsToIgnore] 
AS {[FirstEmptyMonth].Item(0) : NULL} 
    + 
     {NULL : [FirstEmptyMonth].Item(0).Lag(25)} ;     
CREATE MEMBER CURRENTCUBE.[Measures].[Moving Average] 
AS IIF 
    (
     Intersect({[Time].[Month].CurrentMember},[MonthsToIgnore]).Count = 1 
    ,null 
    ,Avg 
    (
    [Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember 
    ,[Measures].[Count] 
) 
    ); 

ответ

1

В AdvWrks я получил это:

WITH 
    SET [FutureMonthsWithNoData] AS 
    { 
     Tail 
     (
      NonEmpty 
      (
      [Date].[Calendar].[Month].MEMBERS 
      ,[Measures].[Internet Sales Amount] 
     ) 
     ,1 
     ).Item(0).NextMember 
     : NULL 
    } 
    MEMBER [Measures].[blah] AS 
    IIF 
    (
     Intersect 
     (
      {[Date].[Calendar].CurrentMember} 
     ,[FutureMonthsWithNoData] 
     ).Count 
     = 1 
    ,null 
    ,1 
    ) 
SELECT 
    { 
    [Measures].[Internet Sales Amount] 
    ,[Measures].[blah] 
    } ON 0 
,[Date].[Calendar].[Month].MEMBERS ON 1 
FROM [Adventure Works]; 

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

enter image description here

Так что я говорю, что вы можете создать это начальное набор FutureDatesWithNoData, а затем использовать этот набор для создания условия в вашем скрипте. Набор будет (я думаю), это в кубе:

SET [FutureMonthsWithNoData] AS 
{ 
    Tail 
    (
     NonEmpty 
     (
     [Time].[Month].[Month].MEMBERS 
     ,[Measures].[Count] 
    ) 
    ,1 
    ).Item(0).NextMember 
    : NULL 
} 

Ваша мера затем будет следующим:

IIF 
(
    Intersect 
    (
     {[Time].[Month].CurrentMember} 
    ,[FutureMonthsWithNoData] 
    ).Count 
    = 1 
,NULL 
,Avg 
    (
    [Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember 
    ,[Measures].[Count] 
) 
) 

Если вы хотите также исключить месяцев до 24 месяцев назад, то этот сценарий суммирует логику:

WITH 
    SET [FistEmptyMonth] AS 
    { 
     Tail 
     (
     NonEmpty 
     (
      [Date].[Calendar].[Month].MEMBERS 
     ,[Measures].[Internet Sales Amount] 
     ) 
     ,1 
    ).Item(0).NextMember 
    } 
    SET [MonthsToIgnore] AS 
     {[FistEmptyMonth].Item(0) : NULL} 
    + 
     {NULL : [FistEmptyMonth].Item(0).Lag(24)} 
    MEMBER [Measures].[blah] AS 
    IIF 
    (
     Intersect({[Date].[Calendar].CurrentMember},[MonthsToIgnore]).Count = 1 
    ,null 
    ,1 
    ) 
SELECT 
    {[Measures].[Internet Sales Amount]} ON 0 
,[Date].[Calendar].[Month].MEMBERS ON 1 
FROM [Adventure Works]; 
+0

Спасибо, но, возможно, я не очень хорошо объяснил свою проблему. Хотя это действительно скрывает будущие месяцы, моя главная проблема заключается в том, что я хочу получить только последние 24 непустых месяца. Например, если последний непустой месяц - май 2015 года, я хочу включить месяцы только в период с июня 2013 года по май 2015 года. Таким образом, в основном, скрыть как будущие месяцы, так и месяцы, которые составляют> 24 месяца назад от последнего непустого один. – user4483037

+0

мы можем просто использовать FutureMonthsWithNoData для создания другого набора – whytheq

+1

После адаптации последнего скрипта и добавления части Avg() теперь у меня есть именно то, что я хотел! Спасибо! – user4483037

Смежные вопросы