Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Хитрый расчет суммы за прошлый период. / 3 сообщений из 3, страница 1 из 1
22.03.2019, 09:58
    #39789912
ondorsal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый расчет суммы за прошлый период.
Коллеги, вопрос.
Нужно рассчитать оборот за аналогичный месяц в прошлом году, что сделано во второй части IIF и работает быстро.
Но, если сравнивать текущий месяц, который еще не закончился - мы должны за прошлый период считать оборот по числу рабочих дней, прошедших в текущем месяце (чтобы обороты были сравнимы). Это сделано в первой части IIF, но работает медленно.
Мера [Текущий месяц] показывает является ли данный месяц текущим.
Запрос:

[Measures].[Оборот прошлый период]

iif([Текущий месяц],sum(MTD( PARALLELPERIOD([Календарь].[Календарь рабочих дней].[Месяц],12,
Ancestor( StrToMember('[Календарь].[Календарь рабочих дней].[Дата].&['+vba!format( date(), "yyyy-MM-dd" )+'T00:00:00]'),1)) ),
[Measures].[Оборот]),sum(MTD( [Календарь].[Календарь].currentMember.lag(12)),[Measures].[Оборот]))

Тормозит вторая часть запроса, как можно её оптимизировать? SSAS 2014 Dev.
Спасибо.
...
Рейтинг: 0 / 0
22.03.2019, 10:07
    #39789915
ondorsal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый расчет суммы за прошлый период.
Тормозит эта часть запроса.

sum(MTD( PARALLELPERIOD([Календарь].[Календарь рабочих дней].[Месяц],12,
Ancestor( StrToMember('[Календарь].[Календарь рабочих дней].[Дата].&['+vba!format( date(), "yyyy-MM-dd" )+'T00:00:00]'),1)) ),
[Measures].[Оборот])
...
Рейтинг: 0 / 0
22.03.2019, 14:18
    #39790057
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый расчет суммы за прошлый период.
ondorsal,

пример на велозаводе

Код: 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.
with member measures.cd as '[Date].[Calendar].[Date].&[' + format( now(), "2010MMdd" ) + ']'
member PPsetstr as '{' + MemberToStr({MTD(
	  Cousin(
	    StrToMember(measures.cd), 
	    ParallelPeriod([Date].[Calendar].[Month], 12, [Date].[Calendar].CurrentMember)
	  )
	) as PPSet}.Item(0).Item(0)) + ':' + MemberToStr(BottomCount(PPset, 1).Item(0).Item(0)) + '}'
member CYsetstr as '{' + MemberToStr({MTD(
	  Cousin(
	    StrToMember(measures.cd), 
	    [Date].[Calendar].CurrentMember
	  )
	) as CYset}.Item(0).Item(0)) + ':' + MemberToStr(BottomCount(CYset, 1).Item(0).Item(0)) + '}'
member PPsum as sum( MTD(
	  Cousin(
	    StrToMember(measures.cd), 
	    ParallelPeriod([Date].[Calendar].[Month], 12, [Date].[Calendar].CurrentMember)
	  )
	), [Measures].[Internet Sales Amount])
member CYsum as sum( MTD(
	  Cousin(
	    StrToMember(measures.cd), 
	    [Date].[Calendar].CurrentMember
	  )
	), [Measures].[Internet Sales Amount])

select 
{cd, PPsetstr, PPsum, CYsetstr, CYsum} on columns,
{descendants([Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Month])} on rows
from [Adventure Works]



но есть замечания, я не знаю как у Вас устроен Календарь рабочих дней, и если в нем только рабочие дни, то вряд-ли будет работать.
в примере заменил вместо 'yyyy' на '2010' - у меня в велозаводе таких дат. и функцию date() 2012 не видит, только now(), но не принципиально.
в Вашей формуле параллельный период не учитывает, что текущий месяц короче, я же в своем примере наоборот обрезал все месяцы до аналогичного тек дня.
строковые представления наборов дат только для визуализации процесса.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Хитрый расчет суммы за прошлый период. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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