12.10.2013, 17:58 | #1 |
Участник
|
Прошу помощи в OLAP
Всем доброго времени суток!
Хочу попросить помощи у знатоков OLAP, в частности SSAS. DAX 2012 R2 Имею следующие исходные условия: Есть таблица, имеющая поля: 1. Поле основанное на EDT, который построен как массив из 7 элементов, определяющих каждый из дней недели и заполняющийся некоторым числовым значением (то есть определяет некое количество единиц в определённый день недели). Назову это поле Результаты (Results). 2. Есть два поля дат FromDate - дата начала недели ToDate - дата окончания недели. 3. Worker - поле, которое ссылается на таблицу сотрудников и будет обычной аналитикой. Задача в следующем: Создать такое измерение Даты, которое даст возможность анализировать числовые значения поля Результаты (Measure, Sum) как обычное измерение даты (в разрезе лет, кварталов, месяцев, недель и дней ). то есть, по сути, произвести разбивку массива из семи элементов для каждой даты недели. Но как это правильно сделать и, что ещё важнее, возможно ли это? Буду благодарен за любые советы! Спасибо! Последний раз редактировалось Cardagant; 12.10.2013 в 18:31. |
|
12.10.2013, 19:56 | #2 |
Участник
|
Структура в "сыром" виде для OLAP малоподходящая.
В любом случае я бы сначала привёл её к удобоваримому виду с помощью, например, периодического задания, которое будет переливать данные в буферную таблицу. Отсюда вопросы: 1. FromDate и ToDate - это всегда понедельник и воскресенье? 2. Result - аддитивная мера для всех измерений? Если в обоих случаях "да" - то всегда можно вычислить дату, зная индекс элемента в массиве. Тогда просто грузим данные в таблицу вида: Дата Сотрудник Result и всё это скармливаем SSAS, где будет использоваться совершенно стандартное измерение дат. |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
12.10.2013, 20:29 | #3 |
Участник
|
Цитата:
Сообщение от Alex_K
Структура в "сыром" виде для OLAP малоподходящая.
В любом случае я бы сначала привёл её к удобоваримому виду с помощью, например, периодического задания, которое будет переливать данные в буферную таблицу. Отсюда вопросы: 1. FromDate и ToDate - это всегда понедельник и воскресенье? 2. Result - аддитивная мера для всех измерений? Если в обоих случаях "да" - то всегда можно вычислить дату, зная индекс элемента в массиве. Тогда просто грузим данные в таблицу вида: Дата Сотрудник Result и всё это скармливаем SSAS, где будет использоваться совершенно стандартное измерение дат. 1. Да. 2. Это никак не связанные между собой величины результативности данного дня. Но все считаются как суммы. То есть, насколько я понимаю,,никакие стандартные преобразования, к примеру вычисляемые поля или др., здесь применить не удастся. Понял, спасибо! Последний раз редактировалось Cardagant; 12.10.2013 в 21:09. |
|
12.10.2013, 21:53 | #4 |
Участник
|
Я, честно говоря, давненько в Аксапту не заглядывал и не помню, как в базе хранятся значения массивов, но теоретически всё, что я сказал, можно сделать SQL-запросом на уровне DataSourceView в SSAS. Тогда выгрузка не понадобится.
|
|
12.10.2013, 22:26 | #5 |
Участник
|
Цитата:
Upd: Не нахожу я что-то инструментов у ДатасорсВью для реализации подобного. Последний раз редактировалось Cardagant; 12.10.2013 в 23:47. |
|
13.10.2013, 00:59 | #6 |
Участник
|
Правый клик по диаграмме DatasourceView:
Обычный конструктор запросов. Кстати, а редакция SQL какая? |
|
13.10.2013, 01:26 | #7 |
MCTS
|
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом: 1. Сделать таблицу / представление из 7 значений. 2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view). 3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату.
__________________
I could tell you, but then I would have to bill you. |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
13.10.2013, 23:44 | #8 |
Участник
|
Цитата:
Сообщение от twilight
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом: 1. Сделать таблицу / представление из 7 значений. 2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view). 3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату. |
|
13.10.2013, 23:45 | #9 |
Участник
|
Цитата:
Сообщение от Alex_K
Правый клик по диаграмме DatasourceView:
Вложение 8450 Обычный конструктор запросов. Кстати, а редакция SQL какая? Последний раз редактировалось Cardagant; 13.10.2013 в 23:50. |
|
14.10.2013, 00:45 | #10 |
MCTS
|
Цитата:
В таблице создать 7 записей со значениями 0, 1, 2, 3, 4, 5, 6. В query для нового view в датасорсе по DayOfWeekTable relation не задавать, тогда получится cross join. Т. е. на каждую запись исходной таблицы будет 7 записей в новой view с различными значения DayOfWeek. Далее создаем вычислимые поля, в котором используем SysComputedColumn::switch() и прочие функции для анализа DayOfWeek. Для даты прибавляем к начальной дате DayOfWeek, для результата берем соответвующий DayOfWeek элемент из массива.
__________________
I could tell you, but then I would have to bill you. |
|
14.10.2013, 16:39 | #11 |
Участник
|
|
|
14.10.2013, 19:50 | #12 |
Участник
|
Цитата:
К примеру, для Results это было бы Result, Result2_, Result3_, ..., Result7_ |
|
14.10.2013, 19:51 | #13 |
Участник
|
Цитата:
Сообщение от twilight
Например, создать таблицу DayOfWeekTable с одним полем DayOfWeek, целое.
В таблице создать 7 записей со значениями 0, 1, 2, 3, 4, 5, 6. В query для нового view в датасорсе по DayOfWeekTable relation не задавать, тогда получится cross join. Т. е. на каждую запись исходной таблицы будет 7 записей в новой view с различными значения DayOfWeek. Далее создаем вычислимые поля, в котором используем SysComputedColumn::switch() и прочие функции для анализа DayOfWeek. Для даты прибавляем к начальной дате DayOfWeek, для результата берем соответвующий DayOfWeek элемент из массива. |
|
14.10.2013, 22:02 | #14 |
Участник
|
Цитата:
Благодарю! |
|
14.10.2013, 22:18 | #15 |
MCTS
|
Например, вот анализируется поле EnumItemValue из датасорса MSKOLAP_FactTypeView представления MSKOLAP_FactSalesView и выбирается соответвующее ему значение из Map amountMap
X++: public static server str getAmountFactType1() { #macrolib.MSKOLAP Map amountMap = new Map(Types::String, Types::String); amountMap.insert(#cLiteral(MSKOlapFactType::Qty), #cField(MSKOLAP_FactSalesAllDiscView, CustInvoiceTrans, Qty)); amountMap.insert(#cLiteral(MSKOlapFactType::Retail), MSKOLAP_FactSalesAllDiscView::amount()); amountMap.insert(#cLiteral(MSKOlapFactType::Sale), MSKOLAP_FactSalesAllDiscView::amountSales()); amountMap.insert(#cLiteral(MSKOlapFactType::Purch), MSKOLAP_FactSalesAllDiscView::amountPurch()); return #cSwitch(#cComparisonField(MSKOLAP_FactSalesView, MSKOLAP_FactTypeView, EnumItemValue), amountMap, #cLiteral(0)); } X++: #localmacro.cField SysComputedColumn::returnField(tableStr(%1), identifierStr(%2), fieldStr(%2, %3)) #endmacro #localmacro.cFieldL SysComputedColumn::returnField(tableStr(%1), identifierStr(%2), fieldStr(%3, %4)) #endmacro #localmacro.cAdd SysComputedColumn::add(%1, %2) #endmacro #localmacro.cMultiply SysComputedColumn::multiply(%1, %2) #endmacro #localmacro.cSubtract SysComputedColumn::subtract(%1, %2) #endmacro #localmacro.cLiteral SysComputedColumn::returnLiteral(%1) #endmacro #localmacro.cSwitch SysComputedColumn::switch(%1, %2, %3) #endmacro #localmacro.cComparisonField SysComputedColumn::comparisonField(tableStr(%1), identifierStr(%2), fieldStr(%2, %3)) #endmacro #localmacro.cComparisonFieldL SysComputedColumn::comparisonField(tableStr(%1), identifierStr(%2), fieldStr(%3, %4)) #endmacro #localmacro.cIf SysComputedColumn::if(%1, %2, %3) #endmacro #localmacro.cEqual SysComputedColumn::equalExpression(%1, %2) #endmacro #localmacro.cCast SysComputedColumn::cast(%1, %2) #endmacro #localmacro.isNullExpr SysComputedColumn::isNullExpression(%1) #endmacro
__________________
I could tell you, but then I would have to bill you. |
|
14.10.2013, 23:47 | #16 |
Участник
|
Благодарю!
А как в методе SysComputedColumn::returnField() правильно указать индекс поля массива в третьем параметре? Upd: Можно прописать просто строкой. Но может есть какие-то стандартные методы? Последний раз редактировалось Cardagant; 15.10.2013 в 00:05. |
|
15.10.2013, 00:35 | #17 |
Участник
|
Ну тады и от себя добавлю 5 копеек
Небольшая наколенная модель с использованием оператора UNPIVOT: X++: -- CREATE TABLE Perfomance (EmplID varchar(20), FromDate datetime, ToDate datetime, Result int, Result2_ int, Result3_ int, Result4_ int,Result5_ int,Result6_ int, Result7_ int); GO INSERT INTO Perfomance VALUES ('Иванов','2013-10-07','2013-10-07',1,2,3,4,5,6,7); INSERT INTO Perfomance VALUES ('Иванов','2013-10-14','2013-10-20',4,5,6,7,8,9,10); INSERT INTO Perfomance VALUES ('Петров','2013-10-07','2013-10-07',2,3,4,5,6,7,8); INSERT INTO Perfomance VALUES ('Петров','2013-10-14','2013-10-20',9,8,6,7,8,9,10); GO -- Unpivot SELECT EmplID, (dateadd(DAY, CAST(DayIdx as int), FromDate) ) as TransDate, Results FROM (SELECT EmplID, FromDate, Result "0", Result2_ "1", Result3_ "2", Result4_ "3", Result5_ "4", Result6_ "5", Result7_ "6" FROM Perfomance) p UNPIVOT (Results FOR DayIdx IN ("0", "1", "2", "3", "4", "5", "6") )AS unpvt; GO |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
15.10.2013, 15:33 | #18 |
MCTS
|
Точно не знаю, с полями-массивами в вычислимых полях ранее не сталкивался. А просто указать индекс в [] у названия поля не работает?
__________________
I could tell you, but then I would have to bill you. |
|
15.10.2013, 23:17 | #19 |
Участник
|
2Alex_K
Спасибо большое за Ваш интересный вариант! С удовольствием его попробую! |
|
15.10.2013, 23:23 | #20 |
Участник
|
Цитата:
X++: comparisonExpressionMap.insert(SysComputedColumn::returnLiteral(WeekDays::Monday), SysComputedColumn::returnField(viewName, identifierStr(myTable), fieldStr(myTable, Results) + "[5]")); |
|
|
За это сообщение автора поблагодарили: twilight (1). |
Теги |
olap, ssas, кубы |
|
|