([Dim Calendar Tool].[Calendar Tool Name].[MTD]) = AGGREGATE ( {[Dim Calendar Tool].[Calendar Tool Name].DEFAULTMEMBER} * PERIODSTODATE ( [Dim Calendar].[Calendar YQMD].[Month], [Dim Calendar].[Calendar YQMD].CURRENTMEMBER ) ); /* Этот вариант содержит ошибку, если для "текущего" CURRENTMEMBER в прошлом месяце нет даты, то PARALLELPERIOD возвращает NULL, а вся конструкция NULL */ ([Dim Calendar Tool].[Calendar Tool Name].[Prior MTD]) = AGGREGATE ( {[Dim Calendar Tool].[Calendar Tool Name].DEFAULTMEMBER} * PERIODSTODATE ( [Dim Calendar].[Calendar YQMD].[Month], PARALLELPERIOD([Dim Calendar].[Calendar YQMD].Month, 1, [Dim Calendar].[Calendar YQMD].CURRENTMEMBER) ) ); /* И тогда для проблемных дней не работает сравнение */ SCOPE ([Dim Calendar Tool].[Calendar Tool Name].[% diff MTD vs Prior MTD]); THIS = IIF(([Dim Calendar Tool].[Calendar Tool Name].[Prior MTD]) = 0, NULL, ([Dim Calendar Tool].[Calendar Tool Name].[MTD] - [Dim Calendar Tool].[Calendar Tool Name].[Prior MTD]) / ([Dim Calendar Tool].[Calendar Tool Name].[Prior MTD])); FORMAT_STRING(THIS) = "##0 %;-##0 %;##0 %;"; END SCOPE;
Я пытался разными способами хэндлить это, но работать начинает адски медленно, например:
([Dim Date Tool].[Date Tool Name].[Last MTD]) = Aggregate ( {[Dim Date Tool].[Date Tool Name].DefaultMember} * PeriodsToDate ( [Dim Date].[Calendar YQMD].[Month], IIF ( ISEMPTY(ParallelPeriod([Dim Date].[Calendar YQMD].Month, 1, [Dim Date].[Calendar YQMD].CurrentMember)), Tail(Descendants(Ancestor([Dim Date].[Calendar YQMD].CurrentMember, [Dim Date].[Calendar YQMD].Month).PrevMember, [Dim Date].[Calendar YQMD].[Date], SELF), 1).Item(0), ParallelPeriod([Dim Date].[Calendar YQMD].Month, 1, [Dim Date].[Calendar YQMD].CurrentMember) ) ) );
А как вы это разруливаете?