Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Перенос одного значения на всё измерение (MDX) / 6 сообщений из 6, страница 1 из 1
24.08.2017, 15:24
    #39509987
Larr`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос одного значения на всё измерение (MDX)
Добрый день
Не использовал в кубах особо формул MDX, а теперь вот понадобилось и не могу разобраться.
Возникла задача прогноза продаж на конец текущего месяца.
Считается так: Объем продаж * кол-во дней в текущем месяце / кол-во отработанных дней в месяце.
Я это реализовал так
Код: sql
1.
2.
3.
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
Как правильно переписать формулу?
...
Рейтинг: 0 / 0
25.08.2017, 10:29
    #39510286
bideveloper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос одного значения на всё измерение (MDX)
Количество дней я бы сделал мерой (на основе таблицы времени как таблице фактов).
...
Рейтинг: 0 / 0
25.08.2017, 15:57
    #39510623
bbx1389
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос одного значения на всё измерение (MDX)
а на уровень источника не хотите перенести вычисления?
...
Рейтинг: 0 / 0
28.08.2017, 17:53
    #39511835
Larr`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос одного значения на всё измерение (MDX)
bbx1389а на уровень источника не хотите перенести вычисления?
Да, я, в принципе, почти так и сделал.
Количества дней прячу в dummy-значения в календаре
Код: sql
1.
2.
3.
4.
5.
6.
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?
Код: sql
1.
2.
3.
4.
5.
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 неагрегируемым, он вообще не показывает последний месяц (наверно потому, что в измерении времени здесь неиерархичная структура, а всё привязано тупо к дате-ключу)
...
Рейтинг: 0 / 0
29.08.2017, 12:48
    #39512162
Larr`
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос одного значения на всё измерение (MDX)
Получилось так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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-ветка...
...
Рейтинг: 0 / 0
13.09.2017, 17:48
    #39520638
Перенос одного значения на всё измерение (MDX)
Larr`,

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

а дальше в scope всунуть выражение, которое будет для дней где атрибут = 0 находить через lag(твоя_мера_с_к-вом_дней_заглядываня_назад) нужное тебе значение.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Перенос одного значения на всё измерение (MDX) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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