Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
 SSAS Calculation Dimension  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 985
Привет, запилил Calculation Dimension по подобию https://www.sqlbi.com/articles/datetool-dimension-an-alternative-time-intelligence-implementation/

Он работает на иерархии Calendar YQMD: Year/Quarter/Month/Date. Всё работает класно.

+ как сделано сейчас

([Dim Date Tool].[Date Tool Name].[YTD]) 
    = AGGREGATE
    (
        {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
        PERIODSTODATE
        (
            [Dim Date].[Calendar YQMD].[Year],
            [Dim Date].[Calendar YQMD].CURRENTMEMBER
        )
    );       

FREEZE;       

([Dim Date Tool].[Date Tool Name].[MTD]) 
    = AGGREGATE
    (
        {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
        PERIODSTODATE
        (
            [Dim Date].[Calendar YQMD].[Month],
            [Dim Date].[Calendar YQMD].CURRENTMEMBER
        )
    );       

FREEZE;       

([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)
            )
        )
    );      

FREEZE;    

([Dim Date Tool].[Date Tool Name].[Last Month]) 
    = 
    IIF
    (
        NOT [Dim Date].[Calendar YQMD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar YQMD].[Month],
        NULL,
        AGGREGATE
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            [Dim Date].[Calendar YQMD].CURRENTMEMBER.LAG(1)
        )
    );       

FREEZE;       

([Dim Date Tool].[Date Tool Name].[Past Month]) 
    = 
    IIF
    (
        NOT [Dim Date].[Calendar YQMD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar YQMD].[Month],
        NULL,
        AGGREGATE
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            [Dim Date].[Calendar YQMD].CURRENTMEMBER.LAG(2)
        )
    );       

FREEZE;       

([Dim Date Tool].[Date Tool Name].[Last Week]) 
    = 
    IIF
    (
        NOT [Dim Date].[Calendar WD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar WD].[Week],
        NULL,
        AGGREGATE
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            [Dim Date].[Calendar WD].CURRENTMEMBER.LAG(1)
        )
    );       

FREEZE;       

([Dim Date Tool].[Date Tool Name].[Past Week]) 
    = 
    IIF
    (
        NOT [Dim Date].[Calendar WD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar WD].[Week],
        NULL,
        AGGREGATE
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            [Dim Date].[Calendar WD].CURRENTMEMBER.LAG(2)
        )
    );       

FREEZE;       

([Dim Date Tool].[Date Tool Name].[Yesterday]) 
    = 
    IIF
    (
        NOT [Dim Date].[Calendar YQMD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar YQMD].[Date],
        NULL,
        AGGREGATE
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            [Dim Date].[Calendar WD].CURRENTMEMBER.LAG(1)
        )
    );       

FREEZE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[Avg 14 days]);      
    THIS = 
    IIF
    (
        NOT [Dim Date].[Calendar YQMD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar YQMD].[Date],
        NULL,
        AVG
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            LastPeriods(14, [Dim Date].[Calendar YQMD].CURRENTMEMBER.PREVMEMBER)
        )
    );       

    --FORMAT_STRING(THIS) = "#,##0.00;-#,##0.00"; 

    FREEZE;       

END SCOPE;       


SCOPE ([Dim Date Tool].[Date Tool Name].[Avg 4 months]);      
    THIS = 
    IIF
    (
        NOT [Dim Date].[Calendar YQMD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar YQMD].[Month],
        NULL,
        AVG
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            LastPeriods(4, [Dim Date].[Calendar YQMD].CURRENTMEMBER.PREVMEMBER)
        )
    );       

    --FORMAT_STRING(THIS) = "#,##0.00;-#,##0.00"; 

    FREEZE;       

END SCOPE;       


SCOPE ([Dim Date Tool].[Date Tool Name].[Avg 6 weeks]);      
    THIS = 
    IIF
    (
        NOT [Dim Date].[Calendar WD].CURRENTMEMBER.LEVEL IS [Dim Date].[Calendar WD].[Week],
        NULL,
        AVG
        (
            {[Dim Date Tool].[Date Tool Name].DEFAULTMEMBER} *
            LastPeriods(6, [Dim Date].[Calendar WD].CURRENTMEMBER.PREVMEMBER)
        )
    );       

    --FORMAT_STRING(THIS) = "#,##0.00;-#,##0.00"; 

    FREEZE;       

END SCOPE;       


SCOPE ([Dim Date Tool].[Date Tool Name].[diff yesterday vs 14 days avg]);      

    THIS = ([Dim Date Tool].[Date Tool Name].[Yesterday]) - ([Dim Date Tool].[Date Tool Name].[Avg 14 days]);       

    --FORMAT_STRING(THIS) = "#,##0;-#,##0";

    FREEZE;       

END SCOPE;        

SCOPE ([Dim Date Tool].[Date Tool Name].[% diff yesterday vs 14 days avg]);          

    THIS = IIF(([Dim Date Tool].[Date Tool Name].[Avg 14 days]) = 0, NULL, ([Dim Date Tool].[Date Tool Name].[diff yesterday vs 14 days avg]) / ([Dim Date Tool].[Date Tool Name].[Avg 14 days])); 

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[diff last week vs past week]);      

    THIS = ([Dim Date Tool].[Date Tool Name].[Last Week]) - ([Dim Date Tool].[Date Tool Name].[Past Week]); 

    --FORMAT_STRING(THIS) = "#,##0;-#,##0"; 

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[% diff last week vs past week]);       
    
    THIS = IIF(([Dim Date Tool].[Date Tool Name].[Past Week]) = 0, NULL, ([Dim Date Tool].[Date Tool Name].[diff last week vs past week]) / ([Dim Date Tool].[Date Tool Name].[Past Week]));       

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[diff last week vs 6 weeks avg]);      

    THIS = ([Dim Date Tool].[Date Tool Name].[Last Week]) - ([Dim Date Tool].[Date Tool Name].[Avg 6 weeks]);       

    --FORMAT_STRING(THIS) = "#,##0;-#,##0"; 

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[% diff last week vs 6 weeks avg]);       
    
    THIS = IIF(([Dim Date Tool].[Date Tool Name].[Avg 6 weeks]) = 0, NULL, ([Dim Date Tool].[Date Tool Name].[diff last week vs 6 weeks avg]) / ([Dim Date Tool].[Date Tool Name].[Avg 6 weeks])); 

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[diff last month vs past month]);      
    THIS = ([Dim Date Tool].[Date Tool Name].[Last Month]) - ([Dim Date Tool].[Date Tool Name].[Past Month]);       

    --FORMAT_STRING(THIS) = "#,##0;-#,##0"; 

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[% diff last month vs past month]);       
    
    THIS = IIF(([Dim Date Tool].[Date Tool Name].[Past month]) = 0, NULL, ([Dim Date Tool].[Date Tool Name].[diff last month vs past month]) / ([Dim Date Tool].[Date Tool Name].[Past month])); 

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[diff last month vs 4 months avg]);      

    THIS = ([Dim Date Tool].[Date Tool Name].[Last Month]) - ([Dim Date Tool].[Date Tool Name].[Avg 4 months]);      

    --FORMAT_STRING(THIS) = "#,##0;-#,##0"; 

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[% diff last month vs 4 months avg]);       
    
    THIS = IIF(([Dim Date Tool].[Date Tool Name].[Avg 4 months]) = 0, NULL, ([Dim Date Tool].[Date Tool Name].[diff last month vs 4 months avg]) / ([Dim Date Tool].[Date Tool Name].[Avg 4 months])); 

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       

SCOPE ([Dim Date Tool].[Date Tool Name].[% total (under construction)]);       
    
    THIS = ([Dim Date Tool].[Date Tool Name].DEFAULTMEMBER);       

    FORMAT_STRING(THIS) = "Percent";       

    FREEZE;       

END SCOPE;       



Нужно добавить альтернативные имена для Month и Date, кроме как добавить дополнительные атрибуты Month Name Alternate, и Date Name Alternate в дименшн Dim Date в голову больше ничего не приходит. Но они будут вне иерархии Calendar YQMD. Как бы так заредиректить эти два атрибута на Month и Date в иерархии?

У Руссо по ссылке https://www.sqlbi.com/tools/datetool-dimension/ идут какие-то непонятные мне пляски, если кто-то пояснит был бы рад.

+ как оно у Руссо

//
// CROSS MONTHS
//
SCOPE ( [Date].[Month of Year].[Month of Year].Members,
        [Date].[Month Name].[All],
        [DateTool].[Aggregation].AllMembers,
        [DateTool].[Comparison].AllMembers );   

    ///////////////////////////////////////////////////////////////////////////////////////
    // It should be scoped do:
    // SCOPE ( { [DateTool].[Aggregation].[Year To Date], [DateTool].[Aggregation].[Last 12 Months] } );
    // but since it is not supported, we use the Except function
    SCOPE ([Date].[Year].[Year].Members,
           Except( [DateTool].[Aggregation].Members, {[DateTool].[Aggregation].DefaultMember} ) );
        THIS = Root( StrToMember( "[Date].[Month Name].&[" 
                                  + [Date].[Year].CurrentMember.Properties( 'Key' )
                                  + "]&[" 
                                  + [Date].[Month of Year].CurrentMember.Properties( 'Key' ) 
                                  + "]" ) ); 
    END SCOPE;
    ///////////////////////////////////////////////////////////////////////////////////////
    
    // The FREEZE is necessary to fix the result against possible modifications made by script 
    // for lower levels of attribute hierarchy
    FREEZE; 
END SCOPE; 

30 янв 18, 16:01    [21151742]     Ответить | Цитировать Сообщить модератору
 Re: SSAS Calculation Dimension  [new]
vikkiv
Member

Откуда: London
Сообщений: 1689
churupaha,

если ты потом отдельно не переназначаешь на атрибуты расчёта времени то зачем тебе там freeze?

для решения твоего вопроса можно добавить через properties привязав к нужному атрибуту, они в иерархиях прекрасно показываются (в Excel родное представление будет через дополнительную колонну, есть/была надстройка которая подменяла атрибут - его свойством, кажется что-то типа "OLAP Pivot Extensions", ну или напрямую MDX)..
30 янв 18, 16:38    [21151903]     Ответить | Цитировать Сообщить модератору
 Re: SSAS Calculation Dimension  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 985
vikkiv,

у нас юзают Power BI - он не поймет :(
30 янв 18, 16:53    [21151954]     Ответить | Цитировать Сообщить модератору
 Re: SSAS Calculation Dimension  [new]
vikkiv
Member

Откуда: London
Сообщений: 1689
churupaha,

да, в PowerBI с attribute properties к сожалению пока (?) проблема (висит в листе пожеланий пользователей), тогда пока если только как отдельную меру делать (в самом PowerBI пока не получится т.к. подключение к SSAS/MD идёт через Live Connection и несмотря на сходство это не совсем Direct Query, так что только в кубе) если атрибут в (отдельную = переделывать/менять старые отчёты, путать пользователей навигацией, существующую = то-же по навигации) иерархию не охота добавлять.
30 янв 18, 18:09    [21152174]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить