Растекаясь агрегатами по дереву...
Задача - сборка сумм по древовидному справочнику. Есть справочник: 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: Растекаясь агрегатами по дереву...
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: Растекаясь агрегатами по дереву...
Vladimir Kozlov wrote: Задача - сборка сумм по древовидному справочнику. ... Соответственно, агрегаты по отдельным статьям получаются простеньким запросом с group by, а вот как получить агрегаты агрегатов по узлам дерева? Хочется свести к минимуму шорканье по таблице проводок (то есть Из первоначального справочника генерим таблицу связей, которая для каждого элемента дерева хранит список всех его вышестоящих предков, вплоть до корня, и содержит дополнительное поле - уровень этого предка в дереве. Ключом служит ID элемента и уровень предка. Делаем join таблицы проводок с этой таблицей по ID элемента и заданному уровню детализации (параметр запроса). И группируем по полученному ID предка.
Re: Растекаясь агрегатами по дереву...
Привет, Yurij! Вы пишешь 29 октября 2007: Y Из первоначального справочника генерим таблицу связей, которая для Y каждого элемента дерева хранит список всех его вышестоящих предков, Y вплоть до корня, и содержит дополнительное поле - уровень этого предка Y в дереве. Ключом служит ID элемента и уровень предка. Зачем? Почему бы слегка не денормализовать дерево?.. -- With best regards, Alex Cherednichenko.
Re: Растекаясь агрегатами по дереву...
Делаем join таблицы проводок с этой таблицей по ID элемента и заданному уровню детализации (параметр запроса). И группируем по полученному ID предка. Нужна детализация по всем уровням. Поэтому хочется вначале получить derived table с агрегатами нижнего уровня и разложить ее по дереву в один проход.
Re: Растекаясь агрегатами по дереву...
Нужна детализация по всем уровням. Поэтому хочется вначале получить derived table с агрегатами нижнего уровня и разложить ее по дереву в один проход. Может не в тему, но: А у тебя выбор при проведении документа предусмотрен только листьев (не имеющих потомков) дерева или можно выбрать и каталог (имеющие потомков) ? А то ведь сумма потомков с суммой каталога могут не сойтись. Я вот с дуру разрешил выбирать каталоги, так задолбался в отчетах добавлять к каждому из них несуществующий лист с именем не указано
Re: Растекаясь агрегатами по дереву...
А у тебя выбор при проведении документа предусмотрен только листьев (не имеющих потомков) дерева или можно выбрать и каталог (имеющие потомков) ? А то ведь сумма потомков с суммой каталога могут не сойтись. Я вот с дуру разрешил выбирать каталоги, так задолбался в отчетах добавлять к каждому из них несуществующий лист с именем не указано Разумеется только листьев. Это ж одним NOT EXISTS в запросе для списка выбора решается... Кстати решил задачу через GTT. То есть первичные агрегаты для листьев загоняются в GTT, там около 110 записей получается - то есть сущая мелочь; потом эта GTT джойнится со справочником, при этом участвует процедура является ли узел A потомком узла С, ну и агрегирование. То есть сборка дерева таки одним запросом получилась как я и хотел - и еще один запрос чтоб подготовить GTT а не джойнить с derived table.