Насколько я понимаю ваш вопрос, тогда да, вы можете включить количество при использовании иерархической спецификации.Насколько я понимаю, ваш вопрос заключается в том, что если одна запись спецификации имеет сумму, например, 10, то сумму для ее дочерних элементов нужно умножить на 10 (потому что у вас в 10 раз больше «дочернего» элемента).
Со следующей таблицей и образцами данных:
create table bom_entry
(
entry_id integer primary key,
product text, -- should be a foreign key to the product table
amount integer not null,
parent_id integer references bom_entry
);
insert into bom_entry
values
(1, 'Box', 1, null),
(2, 'Screw', 10, 1),
(3, 'Nut', 2, 2),
(4, 'Shim', 2, 2),
(5, 'Lock', 2, 1),
(6, 'Key', 2, 5);
Таким образом, для нашей коробки требуется 10 винтов, а для каждого винта нужны 2 гайки и 2 прокладки, поэтому нам нужно всего 20 гаек и 20 прокладок.У нас также есть два замка, и у каждого замка есть два ключа, поэтому у нас всего 4 ключа.
Вы можете использовать рекурсивный CTE, чтобы пройти по дереву и вычислить сумму для каждого элемента.
with recursive bom as (
select *, amount as amt, 1 as level
from bom_entry
where parent_id is null
union all
select c.*, p.amt * c.amount as amt, p.level + 1
from bom_entry c
join bom p on c.parent_id = p.entry_id
)
select rpad(' ', (level - 1)*2, ' ')||product as product, amount as entry_amount, amt as total_amount
from bom
order by entry_id;
rpad / level используется для создания отступа для визуализации иерархии.Приведенный выше запрос возвращает следующее:
product | entry_amount | total_amount
---------+--------------+-------------
Box | 1 | 1
Screw | 10 | 10
Nut | 2 | 20
Shim | 2 | 20
Lock | 2 | 2
Key | 2 | 4