Recursive expansion can calculate component quantities through nested assemblies.

Program

Play the script to choose how many kits are built and expand the required parts.

bom_expansion.sql
CREATE TABLE bom (parent TEXT, child TEXT, qty INTEGER);
INSERT INTO bom VALUES ('kit', 'frame', 1), ('kit', 'wheel_set', 2), ('wheel_set', 'wheel', 2), ('wheel_set', 'bolt', 4);
WITH RECURSIVE params(build_count) AS (VALUES ()), parts(part, required_qty) AS (SELECT child, qty * (SELECT build_count FROM params) FROM bom WHERE parent = 'kit' UNION ALL SELECT b.child, parts.required_qty * b.qty FROM bom AS b JOIN parts ON b.parent = parts.part) SELECT part, SUM(required_qty) AS total_qty FROM parts GROUP BY part ORDER BY part;
CREATE TABLE bom (parent TEXT, child TEXT, qty INTEGER);
INSERT INTO bom VALUES ('kit', 'frame', 1), ('kit', 'wheel_set', 2), ('wheel_set', 'wheel', 2), ('wheel_set', 'bolt', 4);
WITH RECURSIVE params(build_count) AS (VALUES ()), parts(part, required_qty) AS (SELECT child, qty * (SELECT build_count FROM params) FROM bom WHERE parent = 'kit' UNION ALL SELECT b.child, parts.required_qty * b.qty FROM bom AS b JOIN parts ON b.parent = parts.part) SELECT part, SUM(required_qty) AS total_qty FROM parts GROUP BY part ORDER BY part;
CREATE TABLE bom (parent TEXT, child TEXT, qty INTEGER);
INSERT INTO bom VALUES ('kit', 'frame', 1), ('kit', 'wheel_set', 2), ('wheel_set', 'wheel', 2), ('wheel_set', 'bolt', 4);
WITH RECURSIVE params(build_count) AS (VALUES ()), parts(part, required_qty) AS (SELECT child, qty * (SELECT build_count FROM params) FROM bom WHERE parent = 'kit' UNION ALL SELECT b.child, parts.required_qty * b.qty FROM bom AS b JOIN parts ON b.parent = parts.part) SELECT part, SUM(required_qty) AS total_qty FROM parts GROUP BY part ORDER BY part;
bill of materials Each row says how many child parts one parent assembly needs.
quantity multiplication The recursive step multiplies nested quantities as it descends.
rollup `SUM(required_qty)` combines requirements for repeated parts.