Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Vladimir Kozlov


Задача - сборка сумм по древовидному справочнику.

Есть справочник:

1. Расходы
1.1. Вид расходов 1
1.1.1. Статья 1
1.1.2. Статья 2
1.2. Вид расходов 2
1.2.1. Статья 3
1.2.2. Статья 4
...

в нем есть ссылки на самого себя по parent_id, то есть обычная древовидная  
таблица (вложенность произвольная, есть ветки глубиной в 2 а есть в 7).


И есть таблица проводок, где каждая статья (1.1.1, 1.1.2, 1.2.1,  
1.2.2,...) присутсвует в виде субконто по дебету либо кредиту.  
Соответственно, агрегаты по отдельным статьям получаются простеньким  
запросом с group by, а вот как получить агрегаты агрегатов по узлам  
дерева? Хочется свести к минимуму шорканье по таблице проводок (то есть  
желательно обработать ее одним проходом).


Пока что как вариант - загнать первоначальные агрегаты во временную  
таблицу (FB 2.1) и в сборке сумм по дереву работать с ней, но может есть  
более элегантное решение?







Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Мадорский Г . В .



Vladimir Kozlov [EMAIL PROTECTED] 
сообщил/сообщила в новостях следующее: news:[EMAIL PROTECTED]


Задача - сборка сумм по древовидному справочнику.

Есть справочник:

1. Расходы
1.1. Вид расходов 1
1.1.1. Статья 1
1.1.2. Статья 2
1.2. Вид расходов 2
1.2.1. Статья 3
1.2.2. Статья 4
...

в нем есть ссылки на самого себя по parent_id, то есть обычная древовидная 
таблица (вложенность произвольная, есть ветки глубиной в 2 а есть в 7).


И есть таблица проводок, где каждая статья (1.1.1, 1.1.2, 1.2.1, 
1.2.2,...) присутсвует в виде субконто по дебету либо кредиту. 
Соответственно, агрегаты по отдельным статьям получаются простеньким 
запросом с group by, а вот как получить агрегаты агрегатов по узлам 
дерева? Хочется свести к минимуму шорканье по таблице проводок (то есть 
желательно обработать ее одним проходом).


Пока что как вариант - загнать первоначальные агрегаты во временную 
таблицу (FB 2.1) и в сборке сумм по дереву работать с ней, но может есть 
более элегантное решение?


Group By Substring() ? 





Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Yurij


Vladimir Kozlov wrote:
 Задача - сборка сумм по древовидному справочнику.
...
 Соответственно, агрегаты по отдельным статьям получаются простеньким
 запросом с group by, а вот как получить агрегаты агрегатов по узлам
 дерева? Хочется свести к минимуму шорканье по таблице проводок (то есть

 Из первоначального справочника генерим таблицу связей, которая для
каждого элемента дерева хранит список всех его вышестоящих предков,
вплоть до корня, и содержит дополнительное поле - уровень этого предка
в дереве. Ключом служит ID элемента и уровень предка.
 Делаем join таблицы проводок с этой таблицей по ID элемента и
заданному уровню детализации (параметр запроса). И группируем по
полученному ID предка.



Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Alex Cherednichenko

Привет, Yurij!
Вы пишешь  29 октября 2007:

 Y  Из первоначального справочника генерим таблицу связей, которая для
 Y каждого элемента дерева хранит список всех его вышестоящих предков,
 Y вплоть до корня, и содержит дополнительное поле - уровень этого предка
 Y в дереве. Ключом служит ID элемента и уровень предка.

Зачем?
Почему бы слегка не денормализовать дерево?..

-- 
With best regards, Alex Cherednichenko.




Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Vladimir Kozlov



 Делаем join таблицы проводок с этой таблицей по ID элемента и
заданному уровню детализации (параметр запроса). И группируем по
полученному ID предка.


Нужна детализация по всем уровням. Поэтому хочется вначале получить  
derived table с агрегатами нижнего уровня и разложить ее по дереву в один  
проход.




Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность PEAKTOP


 Нужна детализация по всем уровням. Поэтому хочется вначале получить
 derived table с агрегатами нижнего уровня и разложить ее по дереву в один
 проход.

Может не в тему, но:
А у тебя выбор при проведении документа предусмотрен только
листьев (не имеющих потомков) дерева или можно выбрать и
каталог (имеющие потомков) ? А то ведь сумма потомков с суммой
каталога могут не сойтись.
Я вот с дуру разрешил выбирать каталоги, так задолбался в отчетах
добавлять к каждому из них несуществующий лист с именем не
указано



Re: Растекаясь агрегатами по дереву...

2007-10-29 Пенетрантность Vladimir Kozlov



А у тебя выбор при проведении документа предусмотрен только
листьев (не имеющих потомков) дерева или можно выбрать и
каталог (имеющие потомков) ? А то ведь сумма потомков с суммой
каталога могут не сойтись.
Я вот с дуру разрешил выбирать каталоги, так задолбался в отчетах
добавлять к каждому из них несуществующий лист с именем не
указано


Разумеется только листьев. Это ж одним NOT EXISTS в запросе для списка  
выбора решается...


Кстати решил задачу через GTT. То есть первичные агрегаты для листьев  
загоняются в GTT, там около 110 записей получается - то есть сущая мелочь;  
потом эта GTT джойнится со справочником, при этом участвует процедура  
является ли  узел A потомком узла С, ну и агрегирование. То есть сборка  
дерева таки одним запросом получилась как я и хотел - и еще один запрос  
чтоб подготовить GTT а не джойнить с derived table.