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

Откуда: у парня сирийская грусть?
Сообщений: 734
Добрый день
Не использовал в кубах особо формул MDX, а теперь вот понадобилось и не могу разобраться.
Возникла задача прогноза продаж на конец текущего месяца.
Считается так: Объем продаж * кол-во дней в текущем месяце / кол-во отработанных дней в месяце.
Я это реализовал так
CREATE MEMBER CURRENTCUBE.[Measures].[amt forecast]
 AS iif([DATE_OPEN].[Month].currentmember.properties("last month")='-1',[Measures].[agreement amt],NULL)*[DATE_OPEN].[Month].currentmember.properties("Month Days")
 /  ClosingPeriod ([DATE_OPEN].[DATE_OPEN_YMD].[Dm],[DATE_OPEN].[DATE_OPEN_YMD].currentmember).name

Но пользователям надо, чтоб этот member показывался и у других месяцев и на других уровнях [DATE_OPEN] и без него вообще.
то есть не
месяцamtamt forecast
июл10
авг1518
а
месяцamtamt forecast
июл1018
авг1518

Как правильно переписать формулу?
24 авг 17, 15:24    [20747297]     Ответить | Цитировать Сообщить модератору
 Re: Перенос одного значения на всё измерение (MDX)  [new]
bideveloper
Member

Откуда:
Сообщений: 145
Количество дней я бы сделал мерой (на основе таблицы времени как таблице фактов).
25 авг 17, 10:29    [20748520]     Ответить | Цитировать Сообщить модератору
 Re: Перенос одного значения на всё измерение (MDX)  [new]
bbx1389
Member

Откуда: Русија
Сообщений: 23945
а на уровень источника не хотите перенести вычисления?
25 авг 17, 15:57    [20749758]     Ответить | Цитировать Сообщить модератору
 Re: Перенос одного значения на всё измерение (MDX)  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 734
bbx1389
а на уровень источника не хотите перенести вычисления?

Да, я, в принципе, почти так и сделал.
Количества дней прячу в dummy-значения в календаре
CREATE MEMBER CURRENTCUBE.[Measures].[koef]
as [DATE_OPEN].[DATE_OPEN_YMD].[DM].item(0).MEMBERVALUE
    /[DATE_OPEN].[DATE_OPEN_YMD].[DM].item([DATE_OPEN].[DATE_OPEN_YMD].[DM].count-1).MEMBERVALUE,
VISIBLE = 0;
CREATE MEMBER CURRENTCUBE.[Measures].[amt forecast]
 AS ([DATE_OPEN].[last month].&[1],[Measures].[agreement amt])*[Measures].[koef]

Но, когда я презентовал это заказчику, он сказал "это всё, конечно, замечательно, а теперь давай перенесём продажи предыдущих месяцев в этот столбец тоже, мне так удобней", гад
И вот тут я опять застрял. Сделал скоуп, но он показывает правильно только на листовом уровне last month. Как мне его перенести на уровень all?
CREATE MEMBER CURRENTCUBE.[Measures].[amt forecast]
 AS ([Measures].[amt]);
scope ([DATE_OPEN].[last month].&[True],[Measures].[amt forecast]);
this=[Measures].[amt]*[Measures].[koef];
end scope;

Если делать last month неагрегируемым, он вообще не показывает последний месяц (наверно потому, что в измерении времени здесь неиерархичная структура, а всё привязано тупо к дате-ключу)
28 авг 17, 17:53    [20754452]     Ответить | Цитировать Сообщить модератору
 Re: Перенос одного значения на всё измерение (MDX)  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 734
Получилось так:
CREATE MEMBER CURRENTCUBE.[Measures].[amt forecast]
 AS (0), 
FORMAT_STRING = "#,##0", 
NON_EMPTY_BEHAVIOR = { [amt] };
scope ([DATE_OPEN].[last month],[Measures].[amt forecast]);  
[DATE_OPEN].[last month].&[True]=[Measures].[amt]*[Measures].[koef];  
[DATE_OPEN].[last month].&[False]=[Measures].[amt];  
end scope;
scope ([DATE_OPEN].[last month].[All],[Measures].[amt forecast]);  
this=sum([DATE_OPEN].[last month].members, [Measures].[amt forecast]);  
end scope;    

Интересно, можно попроще?
Кажется, надо было сразу делать дополнительным столбцом в таблице фактов, но было жалко
Да и надеялся, что здесь форум поживее, как mssql-ветка...
29 авг 17, 12:48    [20755864]     Ответить | Цитировать Сообщить модератору
 Re: Перенос одного значения на всё измерение (MDX)  [new]
Игорь Бобак
Member

Откуда:
Сообщений: 418
Larr`,

правильно будет написать scope. В измерении дат ввести атрибут зависимый от даты, где будет 1 или 0 - настал этот день или не настал, а также сделать меру, зависящую только от даты, где для дат, что не наступили, будет к-во дней назад на которые надо заглянуть чтобы вытянуть оттуда значение.

а дальше в scope всунуть выражение, которое будет для дней где атрибут = 0 находить через lag(твоя_мера_с_к-вом_дней_заглядываня_назад) нужное тебе значение.
13 сен 17, 17:48    [20793563]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить