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

Откуда:
Сообщений: 37
Редко тут пишу, т.к. во всем сам разбираюсь, а сегодня встрял на элементарной вещи.

Есть такая калькуляха считает средние отгрузки за год. CurrentMember выбран год.
avg(DESCENDANTS([Дата].[Дата].CurrentMember, [Дата].[Дата].[Месяц]), [Measures].[Отгрузки шт])
по сути считает среднее арифметическое по месяцам в разрезе года.
Но она не совсем верная, т.к. с точки зрения бизнес логики надо считать среднее по закрытый месяц. Т.е. надо использовать что-то вроде LAG или PrevMember, но в DESCENDANTS это не работает в данном разрезе....

Вопрос как сместить период на -1 месяц (на -1 мембер)
9 окт 18, 17:50    [21699559]     Ответить | Цитировать Сообщить модератору
 Re: MDX калькуляха среднее  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2502
Nurgl
Редко тут пишу, т.к. во всем сам разбираюсь, а сегодня встрял на элементарной вещи.

Есть такая калькуляха считает средние отгрузки за год. CurrentMember выбран год.
avg(DESCENDANTS([Дата].[Дата].CurrentMember, [Дата].[Дата].[Месяц]), [Measures].[Отгрузки шт])
по сути считает среднее арифметическое по месяцам в разрезе года.
Но она не совсем верная, т.к. с точки зрения бизнес логики надо считать среднее по закрытый месяц. Т.е. надо использовать что-то вроде LAG или PrevMember, но в DESCENDANTS это не работает в данном разрезе....

Вопрос как сместить период на -1 месяц (на -1 мембер)

А потом будет еще вот какая проблема. Вы развернете копию OLAP базы, чтобы работать с ней как со срезом. Но вот эти "закрытые" месяцы будут смещаться.
Вывод - сделать группу мер со счетчиком "Счетчик закрытых месяцев", суммирование строк с 1, привязка к "Дата"."Месяц" неключевому атрибуту.

Сделать набор выбранных месяцев как DynamicMonthsSet as existing [Дата].[Месяц].[Месяц];
А формулу "Средние отгрузки шт" считать как AVG(existing [DynamicMonthsSet], iif(Measures.[Счетчик закрытых месяцев] = 1, [Measures].[Отгрузки шт], null) )

На уровень года останутся только его месяцы, из них будут выбраны закрытые. Группу мер при пересчете ежедневно обновлять, создайте view, куда формулой прописывайте 1 для нужных месяцев. Как только копия OLAP базы разворачивается для архивной работы - перестаете пересчитывать закрытые месяцы.

И вот эти закрытые с точки зрения бизнеса месяцы всегда используйте из одного места и из одного dynamic set набора.
9 окт 18, 17:57    [21699566]     Ответить | Цитировать Сообщить модератору
 Re: MDX калькуляха среднее  [new]
vikkiv
Member

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

вариантов решения множество, так что зависит от вкусов реализации алгоритма (и рекомендаций производительности).
а так-же логики определения закрытости месяца
(например последний/текущий из now() и после скорее всего всегда не закрыт, даже для завтра,
т.к. данных обычно пока нет чтобы его закрыть, в т.с. можно дополнительную проверку вставить в ветвь решения)
в общем случае если контекст ячейки устанавливается на гранулярности дня то
1) от дня переходим к месяцу через .parent
2) месяц сдвигаем через .prevmember или .lag(1) или .lead(-1)
3) потом от полученного месяца и получаем descendants(..,,leaves) или .children
например:
with member[Measures].[_x1]as[Date].[Calendar].parent.prevmember.member_name
member[Measures].[_x2]as[Date].[Calendar].parent.prevmember.children.count
member[Measures].[_x3]as sum([Date].[Calendar].parent.prevmember.children,[Measures].[Internet Order Quantity])
member[Measures].[_x4]as([Date].[Calendar].parent.prevmember,[Measures].[Internet Order Quantity])
member[Measures].[_x5]as([Date].[Calendar].parent,[Measures].[Internet Order Quantity])
select{[Measures].[_x1],[Measures].[_x2],[Measures].[_x3],[Measures].[_x4],[Measures].[_x5]}on 0 
,{[Date].[Calendar].[Date].&[20130129],[Date].[Calendar].[Date].&[20130202],[Date].[Calendar].[Date].&[20130305]}
on 1from[Adventure Works]
9 окт 18, 21:43    [21699778]     Ответить | Цитировать Сообщить модератору
 Re: MDX калькуляха среднее  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 30514
Блог
Nurgl,

проще будет порекомендовать пользователям самим снимать галку с незакрытого месяца

у вас сейчас незакрытый месяц с точки зрения одного заказчика (пусть это подрезделение "склад"),
потом будет незакрытый месяц с точки зрения бухгалтерии,
потом у третьего подразделения будет свой незакрытый месяц,

и все они будут разными...
10 окт 18, 15:35    [21700626]     Ответить | Цитировать Сообщить модератору
 Re: MDX калькуляха среднее  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2502
Критик
Nurgl,

проще будет порекомендовать пользователям самим снимать галку с незакрытого месяца

у вас сейчас незакрытый месяц с точки зрения одного заказчика (пусть это подрезделение "склад"),
потом будет незакрытый месяц с точки зрения бухгалтерии,
потом у третьего подразделения будет свой незакрытый месяц,

и все они будут разными...

Таки да. И можно сделать измерение "ТипыЗакрытыхПериодов" - для бухгалтерии один элемент измерения и набор 1 для месяцев, для склада второй элемент измерения и набор 2 для месяцев, и все эти наборы в одну view и одну отдельную группу мер. Вместо того, чтобы пытаться с NOW() работать.
Потому что бывает ситуация, когда нужно взять OLAP базу и заморозить ее копию. Например, классификатор для номенклатуры поменяли, а планы продаж идут по веткам старого классификатора. Для нового не будут заново распределять планы, а факты в прошлом разъедутся. И получится LFL анализ выполнения план-фактов продаж кривым. Выход - оставить навсегда копию OLAP базы со старым классификатором и не менять никогда больше измерение номенклатуры. Как и набор закрытых месяцев. Не заставлять пользователей каждый раз галочками ставить перечень месяцев. Они ведь забудут, какие были тогда закрытые, какие открытые.

Если можно логику от бизнеса формализовать и зафиксировать в виде физических measures вместо набора непонятных формул, которые "извне" куба не видны - тогда нужно фиксировать. И не пользоваться NOW(). Я так думаю.
10 окт 18, 19:27    [21700937]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить