powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / SSAS Calculation Dimension
4 сообщений из 4, страница 1 из 1
SSAS Calculation Dimension
    #39593426
churupaha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, запилил Calculation Dimension по подобию https://www.sqlbi.com/articles/datetool-dimension-an-alternative-time-intelligence-implementation/

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

как сделано сейчас
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
([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/ идут какие-то непонятные мне пляски, если кто-то пояснит был бы рад.

как оно у Руссо
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
//
// 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; 


...
Рейтинг: 0 / 0
SSAS Calculation Dimension
    #39593451
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
churupaha,

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

для решения твоего вопроса можно добавить через properties привязав к нужному атрибуту, они в иерархиях прекрасно показываются (в Excel родное представление будет через дополнительную колонну, есть/была надстройка которая подменяла атрибут - его свойством, кажется что-то типа "OLAP Pivot Extensions", ну или напрямую MDX)..
...
Рейтинг: 0 / 0
SSAS Calculation Dimension
    #39593472
churupaha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

у нас юзают Power BI - он не поймет :(
...
Рейтинг: 0 / 0
SSAS Calculation Dimension
    #39593514
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
churupaha,

да, в PowerBI с attribute properties к сожалению пока (?) проблема (висит в листе пожеланий пользователей), тогда пока если только как отдельную меру делать (в самом PowerBI пока не получится т.к. подключение к SSAS/MD идёт через Live Connection и несмотря на сходство это не совсем Direct Query, так что только в кубе) если атрибут в (отдельную = переделывать/менять старые отчёты, путать пользователей навигацией, существующую = то-же по навигации) иерархию не охота добавлять.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / SSAS Calculation Dimension
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]