Интересны также общие соображения. Например клиент формирует отчет по всей продукции за год, но такой отчет в оперативе не поместится.... Как быть? Покрутить пальцем у виска или предложить альтернативу?
Крутить у виска - не доблесть, значит нужна альтернатива...
(если по-хорошему, то начать следовало бы, наверное, с проектирования БД под предметную область)
Клиенту по сути нужна комфортная работа. Чтобы, изменив период или отбор какой, не приходилось ждать по 6 часов.
... и клиент прав...
Сразу все мы не можем закачать на клиента, значит нужно динамически подтягивать по мере необходимости.... но делать это эффективно.
Можно подкачивать, можно сформировать [временную] таблицу и потом читать из неё.
Тут коренные проблемы две:
1. Нам неизвестна глубина формируемого дерева
2. В дереве могут быть циклы
1. Глубина не слишком важна, если данные для отчёта формируются во временной таблице, да, и при подкачке данных на клиента... тоже не слишком проблематично. Хотя не очень понятен тезис о произвольной глубине иерархии. Неужели структура себестоимости продукции/затрат произвольна?.. Может быть поговорить с экономистами?..
2. Циклов в "дереве" быть не может, иначе это не "дерево", а циклический граф. Возможно, имелось ввиду, что на одну вложенную ветку ссылаются две других ветки-владельцы?.. Тогда это не "дерево", а сеть, орграф.
В любом случае, Вам надо составить "дерево" (иерархию) запросов. Результаты этих запросов будут либо закачиваться на клиента, либо помещаться во временную таблицу (возможно потребуется более одной таблицы). Если используется вариант со временными таблицами, то создавать "дерево" лучше не с помощью ссылок на родительский узел, а с помощью диапазонов. При этом нежелательны произвольная глубина и циклы, поскольку решение будет более трудоёмким, хотя и возможным.
Какая СУБД используется?