BOM 扩展数量的 Oracle SQL
Oracle SQL for BOM Extended Quantity
希望构建一个查询来显示来自多级分层数据的扩展数量。
我有一个物料清单 (BOM) table,它定义了组件的关系、它包含的零件以及每个零件的数量。每个零件都可以是子组件,也定义为零件和数量的表达式。在下面的 table 中,Item0 包含一个 Item1 -- Item1 包含两个项目:一个 Item3 和两个 Item6 -- 依此类推。
使用 Oracle 的分层查询功能,我成功地编写了一个查询来展开给定项目的所有子项目,但我需要一些帮助来计算扩展数量。
SQL Fiddle 示例架构和分层查询:
http://sqlfiddle.com/#!4/5217c/1
这是我的来源table:
+------------+-----------+----------+
| PARENTNODE | CHILDNODE | QUANTITY |
+------------+-----------+----------+
| Item0 | Item1 | 2 |
| Item0 | Item5 | 1 |
| Item0 | Item6 | 2 |
| Item0 | Item7 | 2 |
| Item0 | Item9 | 384 |
| Item1 | Item3 | 1 |
| Item1 | Item6 | 2 |
| Item3 | Item11 | 1 |
| Item3 | Item14 | 1 |
| Item3 | Item15 | 1 |
| Item3 | Item16 | 3 |
| Item3 | Item17 | 1 |
| Item3 | Item18 | 1 |
| Item3 | Item19 | 1 |
| Item3 | Item21 | 1 |
| Item4 | Item20 | 1 |
| Item4 | Item23 | 0 |
| Item4 | Item24 | 1 |
| Item4 | Item8 | 1 |
| Item5 | Item22 | 4 |
| Item5 | Item4 | 4 |
| Item6 | Item10 | 0 |
| Item6 | Item13 | 1 |
| Item6 | Item9 | 32 |
| Item7 | Item12 | 1 |
| Item7 | Item9 | 16 |
+------------+-----------+----------+
我想要的输出如下所示;但是,提供 'multiple' 字段是为了显示扩展数量是如何找到的,这不是必需的:
+------------+-----------+-----+----------+--------+--------------------+
| PARENTNODE | CHILDNODE | Qty | Multiple | ExtQty | Path |
+------------+-----------+-----+----------+--------+--------------------+
| Item0 | Item1 | 2 | 1 | 2 | /Item0 |
| Item0 | Item10 | 0 | 2 | 0 | /Item0/Item1/Item6 |
| Item0 | Item10 | 0 | 4 | 0 | /Item0/Item1/Item6 |
| Item0 | Item11 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item12 | 1 | 2 | 2 | /Item0/Item7 |
| Item0 | Item13 | 1 | 2 | 2 | /Item0/Item1/Item6 |
| Item0 | Item13 | 1 | 4 | 4 | /Item0/Item1/Item6 |
| Item0 | Item14 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item15 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item16 | 3 | 2 | 6 | /Item0/Item1/Item3 |
| Item0 | Item17 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item18 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item19 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item20 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item21 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item22 | 4 | 1 | 4 | /Item0/Item5 |
| Item0 | Item23 | 0 | 4 | 0 | /Item0/Item5/Item4 |
| Item0 | Item24 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item3 | 1 | 2 | 2 | /Item0/Item1 |
| Item0 | Item4 | 4 | 1 | 4 | /Item0/Item5 |
| Item0 | Item5 | 1 | 1 | 1 | /Item0 |
| Item0 | Item6 | 2 | 1 | 2 | /Item0/Item1 |
| Item0 | Item6 | 2 | 2 | 4 | /Item0/Item1 |
| Item0 | Item7 | 2 | 1 | 2 | /Item0 |
| Item0 | Item8 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item9 | 16 | 2 | 32 | /Item0/Item1/Item6 |
| Item0 | Item9 | 384 | 1 | 384 | /Item0/Item1/Item6 |
| Item0 | Item9 | 32 | 2 | 64 | /Item0/Item1/Item6 |
| Item0 | Item9 | 32 | 4 | 128 | /Item0/Item1/Item6 |
+------------+-----------+-----+----------+--------+--------------------+
感谢任何帮助
此递归查询给出了所需的输出:
with r(parentnode, childnode, quantity, eq, pth) as (
select parentnode, childnode, quantity, quantity eq, '/'||parentnode
from exampletable where parentnode='Item0'
union all
select e.parentnode, e.childnode, e.quantity,
e.quantity * r.eq eq, r.pth||'/'||e.childnode
from exampletable e, r
where e.parentnode = r.childnode)
select * from r order by childnode;
希望构建一个查询来显示来自多级分层数据的扩展数量。
我有一个物料清单 (BOM) table,它定义了组件的关系、它包含的零件以及每个零件的数量。每个零件都可以是子组件,也定义为零件和数量的表达式。在下面的 table 中,Item0 包含一个 Item1 -- Item1 包含两个项目:一个 Item3 和两个 Item6 -- 依此类推。
使用 Oracle 的分层查询功能,我成功地编写了一个查询来展开给定项目的所有子项目,但我需要一些帮助来计算扩展数量。
SQL Fiddle 示例架构和分层查询: http://sqlfiddle.com/#!4/5217c/1
这是我的来源table:
+------------+-----------+----------+
| PARENTNODE | CHILDNODE | QUANTITY |
+------------+-----------+----------+
| Item0 | Item1 | 2 |
| Item0 | Item5 | 1 |
| Item0 | Item6 | 2 |
| Item0 | Item7 | 2 |
| Item0 | Item9 | 384 |
| Item1 | Item3 | 1 |
| Item1 | Item6 | 2 |
| Item3 | Item11 | 1 |
| Item3 | Item14 | 1 |
| Item3 | Item15 | 1 |
| Item3 | Item16 | 3 |
| Item3 | Item17 | 1 |
| Item3 | Item18 | 1 |
| Item3 | Item19 | 1 |
| Item3 | Item21 | 1 |
| Item4 | Item20 | 1 |
| Item4 | Item23 | 0 |
| Item4 | Item24 | 1 |
| Item4 | Item8 | 1 |
| Item5 | Item22 | 4 |
| Item5 | Item4 | 4 |
| Item6 | Item10 | 0 |
| Item6 | Item13 | 1 |
| Item6 | Item9 | 32 |
| Item7 | Item12 | 1 |
| Item7 | Item9 | 16 |
+------------+-----------+----------+
我想要的输出如下所示;但是,提供 'multiple' 字段是为了显示扩展数量是如何找到的,这不是必需的:
+------------+-----------+-----+----------+--------+--------------------+
| PARENTNODE | CHILDNODE | Qty | Multiple | ExtQty | Path |
+------------+-----------+-----+----------+--------+--------------------+
| Item0 | Item1 | 2 | 1 | 2 | /Item0 |
| Item0 | Item10 | 0 | 2 | 0 | /Item0/Item1/Item6 |
| Item0 | Item10 | 0 | 4 | 0 | /Item0/Item1/Item6 |
| Item0 | Item11 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item12 | 1 | 2 | 2 | /Item0/Item7 |
| Item0 | Item13 | 1 | 2 | 2 | /Item0/Item1/Item6 |
| Item0 | Item13 | 1 | 4 | 4 | /Item0/Item1/Item6 |
| Item0 | Item14 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item15 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item16 | 3 | 2 | 6 | /Item0/Item1/Item3 |
| Item0 | Item17 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item18 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item19 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item20 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item21 | 1 | 2 | 2 | /Item0/Item1/Item3 |
| Item0 | Item22 | 4 | 1 | 4 | /Item0/Item5 |
| Item0 | Item23 | 0 | 4 | 0 | /Item0/Item5/Item4 |
| Item0 | Item24 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item3 | 1 | 2 | 2 | /Item0/Item1 |
| Item0 | Item4 | 4 | 1 | 4 | /Item0/Item5 |
| Item0 | Item5 | 1 | 1 | 1 | /Item0 |
| Item0 | Item6 | 2 | 1 | 2 | /Item0/Item1 |
| Item0 | Item6 | 2 | 2 | 4 | /Item0/Item1 |
| Item0 | Item7 | 2 | 1 | 2 | /Item0 |
| Item0 | Item8 | 1 | 4 | 4 | /Item0/Item5/Item4 |
| Item0 | Item9 | 16 | 2 | 32 | /Item0/Item1/Item6 |
| Item0 | Item9 | 384 | 1 | 384 | /Item0/Item1/Item6 |
| Item0 | Item9 | 32 | 2 | 64 | /Item0/Item1/Item6 |
| Item0 | Item9 | 32 | 4 | 128 | /Item0/Item1/Item6 |
+------------+-----------+-----+----------+--------+--------------------+
感谢任何帮助
此递归查询给出了所需的输出:
with r(parentnode, childnode, quantity, eq, pth) as (
select parentnode, childnode, quantity, quantity eq, '/'||parentnode
from exampletable where parentnode='Item0'
union all
select e.parentnode, e.childnode, e.quantity,
e.quantity * r.eq eq, r.pth||'/'||e.childnode
from exampletable e, r
where e.parentnode = r.childnode)
select * from r order by childnode;