Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Кросс иерархий в измернии. Oracle. / 11 сообщений из 11, страница 1 из 1
22.05.2006, 18:31
    #33743567
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
Всем добрый день. Сегодня встала такая, на мой взгляд, довольно интересная задача:
Есть измерение. Например GOOD_DIM - товары.
В измерении есть две иерархии:
1. Страны производители.
2. Фирмы поставщики.

Задача: необходимо получить результат в виде таблицы, где по одной оси идут страны, по другой - фирмы.

Вопрос: Как это сделать? :)
Скажем для какой-то конкретной ячейки это будет выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
exec dbms_aw.execute('LIMIT GOOD_DIM TO HIERARCHY DEPTH 1 SKIP 0 USING GOOD_DIM_PARENTREL ''COUNTRY_LEV_England'''); -- значение из иерархии страны
exec dbms_aw.execute('LIMIT GOOD_DIM ADD HIERARCHY DEPTH 1 SKIP 0 USING GOOD_DIM_PARENTREL ''FIRM_LEV_Reebok'''); -- значение из иерархии фирмы
select sum(meas)
from   table
       (
           olap_table('AWG DURATION SESSION', '', '',
           'MEASURE meas FROM CUB_QUANTITY
            DIMENSION D1 FROM GOOD_DIM WITH
                HIERARCHY GOOD_DIM_PARENTREL(GOOD_DIM_HIERLIST ''COUNTRY_HIER'')
                INHIERARCHY GOOD_DIM_INHIER
            DIMENSION D2 FROM GOOD_DIM WITH
                HIERARCHY GOOD_DIM_PARENTREL(GOOD_DIM_HIERLIST ''FIRM_HIER'')
                INHIERARCHY GOOD_DIM_INHIER'
           )
       );

Но это не решение. Что если пользователь хочет получить распределение по всем фирмам и странам? Не генерировать же запрос для каждой ячейки!

Возможно, кто-нибудь сталкивался с подобной задачей. Также интересно, как подобные ситуации решаются в других OLAP системах.
...
Рейтинг: 0 / 0
22.05.2006, 18:38
    #33743587
Виктор Сакович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
Отчёт, конечно, будет дурацкий, будет очень много пустых мест, посколько фирма, по видимому, относится к стране отношением многие к одному (если, конечно, каких-нибудь SCD там не сделано). Но в MicroStrategy проблем не будет - так и покажет.
...
Рейтинг: 0 / 0
22.05.2006, 18:40
    #33743596
Виктор Сакович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
То же самое относится и к Cognos PP.
...
Рейтинг: 0 / 0
22.05.2006, 19:25
    #33743682
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
На всякий случай приведу пример:
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Страна	 Фирма		Товар		Количество
Англия	 Рога		Сервер		 3 
Англия	 Копыта		Тапочки		 4 
Англия	 Копыта		Батарея		 2 
Англия	 Кидалово Ко	Журнал		 6 
Франция	 Рога		Часы		 7 
Франция	 Копыта		Феррари		 5 
Франция	 Хрень		Мышь комп.	 2 
Франция	 Кидалово Ко	Животное	 4 
Франция	 Кидалово Ко	Стол		 1 
Китай	 Кидалово Ко	Телефон		 3 
Китай	 Копыта		Календарь	 1 
Китай	 Копыта		Труба		 2 
Китай	 Рога	        Женщины		 7 

Эта таблица определяет измерение "товары". Соответственно есть две иерархии: Страны и Фирмы. В итоге необходимо получить таблицу:

Код: plaintext
1.
2.
3.
4.
		Англия	Франция	Китай
Рога		 3 	 7 	 7 
Копыта		 6 	 5 	 3 
Кидалово Ко	 6 	 5 	 3 
Хрень		n/a	 2 	n/a
...
Рейтинг: 0 / 0
22.05.2006, 19:26
    #33743685
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
Виктор СаковичТо же самое относится и к Cognos PP.

В Когносе, по-моему, нет такого опрделения как иерархия. Т.е. там вроде сразу измерения строятся. Или я ошибаюсь?
...
Рейтинг: 0 / 0
22.05.2006, 19:46
    #33743709
Jurii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
2 Goster:

То же самое относится и к Cognos PP.
В Когносе, по-моему, нет такого опрделения как иерархия. Т.е. там вроде сразу измерения строятся. Или я ошибаюсь?


Измерения в Cognos PP могут содержать одну или несколько иерархий (альтернативные дрилл-дауны). Если в измерении товаров сделать 2 Ваших иерархии в виде альтернативных дрилл-даунов, то можно будет одну иерархию положить в боковик отчета, а другую - в шапку, и мы получим необходимую Вам кросс-таблицу.

P.S. А во время OLAP-тусы в Питере, г-н Birkhoff Вам не рассказывал как решать такие задачи в Oracle OLAP?

P.P.S. Надо будет возобновить традицию проведения мероприятия OLAP-туса, последнюю из которых я проводил в Москве в ресторане Красная Площадь дом 1 :)
...
Рейтинг: 0 / 0
23.05.2006, 15:48
    #33745992
Георгий Т.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
По просьбе уважаемого Б. попробовал решить исходную задачу в упрощённом виде на чистом DML.
Если глубоко не думать (и не связываться с картами), то получается вот это:


Дано.

1. Измерение MYDIM

Код: plaintext
1.
2.
3.
4.
5.
6.
DEFINE MYDIM DIMENSION TEXT

-> shw obj(prp 'hierdim' 'mydim')
DBMY.HIERDIM

-> shw obj(prp 'parentrel' 'mydim')
DBMY.PARENT

2. С двумя иерархиями (Товары-Страны, Товары-Фирмы)

Код: plaintext
1.
2.
3.
4.
5.
6.
-> lmt DBMY.HIERDIM to all

-> rpr DBMY.HIERDIM
DBMY.HIERDIM
--------------
HCOUNTRY
HFIRM

3. И переменная

Код: plaintext
1.
-> dsc myvar
DEFINE MYVAR VARIABLE DECIMAL <MYDIM>


Добавляем в AW несколько объектов:

4. Измерения-Алиасы MYCOUNTRY и MYFIRM

Код: plaintext
1.
DEFINE MYCOUNTRY DIMENSION ALIASOF MYDIM
DEFINE MYFIRM DIMENSION ALIASOF MYDIM

5. Программу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DEFINE MYPRG PROGRAM DECIMAL
PROGRAM

oknullstatus = y

lmt dbmy.hierdim to 'HCOUNTRY'
lmt mydim to lmt(lmt(mycountry to mycountry(mycountry mycountry)) to descendants using dbmy.parent)

lmt dbmy.hierdim to 'HFIRM'
lmt mydim keep lmt(lmt(myfirm to myfirm(myfirm myfirm)) to descendants using dbmy.parent)

return total(myvar)

END

5*. Либо вот такую программу (смотря что быстрее работает)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DEFINE MYPRG PROGRAM DECIMAL
PROGRAM

vrb _mycountry text
vrb _myfirm text

oknullstatus = y

_mycountry = lmt(mycountry to mycountry(mycountry mycountry))
_myfirm = lmt(myfirm to myfirm(myfirm myfirm))

lmt mydim to lmt(mycountry to dbmy.parent(dbmy.hierdim 'HCOUNTRY', mydim mycountry) eq _mycountry)
lmt mydim keep lmt(myfirm to dbmy.parent(dbmy.hierdim 'HFIRM', mydim myfirm) eq _myfirm)

return total(myvar)


END



6. Формулу (целевую)

Код: plaintext
1.
DEFINE MYFRM FORMULA DECIMAL <MYFIRM MYCOUNTRY>
EQ myprg

Собственно, всё готово.
Тестируем содержимое полученной формулы


7. Устанавливаем статусы (фирмы и страны)

Код: plaintext
1.
lmt myfirm to myfirm like 'FIRM%'
lmt mycountry to mycountry like 'COUNTRY%'

8. Выводим проверочный отчёт

Код: plaintext
rpr myfrm



У меня это корректно работает на тестовой переменной с простыми двухэтажными иерархиями для обоих вариантов программы MYPRG. Подозреваю, что на высоком уровне (там, где всё делается при помощи мышки) всё это попроще.


P.S. Похоже, пора мне посмотреть на Когнос )
...
Рейтинг: 0 / 0
24.05.2006, 10:33
    #33747549
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
2 Георгий Т.:
Спасибо, учитель!

Знание dml - великая вещь. Пошел читать доку.
...
Рейтинг: 0 / 0
02.06.2006, 18:26
    #33769880
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
2 Георгий Т.:
Скажите пожалуйста, а какой смысл здесь имеет выражение
Код: plaintext
lmt(mycountry to mycountry(mycountry mycountry))
Т.е. я понимаю, что без него здесь ничего работать не будет. Но я не понимаю как оно работат. Всю доку изучил - ничего не нашел. Объясните пожалуйста! Или ткните нососм в конкретное место доки.
...
Рейтинг: 0 / 0
02.06.2006, 19:29
    #33769977
Goster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
Хм... Я понял, что эта конструкция позволяет в программе в формуле определить конкретную итерацию по измерениям. Но не могу найти где она описана и понять как она работает. А есть ли другие варианты получить тот же результат?
...
Рейтинг: 0 / 0
05.06.2006, 11:18
    #33771780
Георгий Т.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс иерархий в измернии. Oracle.
Некоторые вещи про Express/DML не описаны в документации (либо я не знаю где именно).

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


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