powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Хитрый расчет суммы за прошлый период.
3 сообщений из 3, страница 1 из 1
Хитрый расчет суммы за прошлый период.
    #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
Хитрый расчет суммы за прошлый период.
    #39789915
ondorsal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тормозит эта часть запроса.

sum(MTD( PARALLELPERIOD([Календарь].[Календарь рабочих дней].[Месяц],12,
Ancestor( StrToMember('[Календарь].[Календарь рабочих дней].[Дата].&['+vba!format( date(), "yyyy-MM-dd" )+'T00:00:00]'),1)) ),
[Measures].[Оборот])
...
Рейтинг: 0 / 0
Хитрый расчет суммы за прошлый период.
    #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
3 сообщений из 3, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Хитрый расчет суммы за прошлый период.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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