本文系转载子ITPUB,如果有侵犯您权益的地方,烦请及时的告知与我,我即刻将停止侵权行为:

LEVEL    Parent   Child    Parent Qty        Child Qty

1            A            B         1                       3

2            B            C         2                       3

3            C            D         5                       6

4            D            E         1                       2

1            A            Z         1                       3

A是成品

B,C,D是半成品

E,Z是原材料

从上面一个比例关系可以计算出,做一个A最终需要10.8个E和3个Z,

也就是能看到下面的结果

Parent  Child   QTY

A           E         10.8

A           Z         3

我想知道有没有什么办法通过一个SQL语句来实现这个功能。

测试表:

CREATE TABLE BOM (PARENT VARCHAR2(10),CHILD VARCHAR2(10),P_QTY NUMBER, C_QTY NUMBER);

INSERT INTO BOM VALUES ('A','B',1,3);

INSERT INTO BOM VALUES ('B','C',2,3);

INSERT INTO BOM VALUES ('C','D',5,6);

INSERT INTO BOM VALUES ('D','E',1,2);

INSERT INTO BOM VALUES ('A','Z',1,3);

COMMIT;

1、使用SQL

SELECT P, D, SUM(QTY)

FROM (SELECT P, C, D, POWER(10, SUM(LOG(10, QTY))) AS QTY

FROM (SELECT DISTINCT P,

C,

SUBSTR(C, -1, 1) D,

REGEXP_SUBSTR(C, '[^,]+', 1, LEVEL),

TO_NUMBER(REGEXP_SUBSTR(Q, '[^*]+', 1, LEVEL)) AS QTY

FROM (SELECT CONNECT_BY_ROOT PARENT AS P,

SUBSTR(SYS_CONNECT_BY_PATH(CHILD, ','), 2) AS C,

1 || SYS_CONNECT_BY_PATH(C_QTY / P_QTY, '*') AS Q

FROM BOM

WHERE CONNECT_BY_ISLEAF = 1

START WITH PARENT = 'A'

CONNECT BY PARENT = PRIOR CHILD) C

CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(Q, '[^*]', '')) + 1

ORDER BY 1, 2) TT

GROUP BY P, C, D) FF

GROUP BY P, D

2、使用NEWID提供的聚合求积函数

解决思路:

1.把A的每个叶子找出来;

2.顺着叶子往根,一路作乘法上去。

SELECT CHILD,

(SELECT PROD_AGG(C_QTY) / PROD_AGG(P_QTY)

FROM BOM

CONNECT BY PRIOR PARENT = CHILD

START WITH CHILD = INNER.CHILD -- 从每个叶子开始

) AS C_QTY

FROM (SELECT BOM.*, CONNECT_BY_ISLEAF AS IS_LEAF

FROM BOM

CONNECT BY PRIOR CHILD = PARENT

START WITH PARENT = 'A')

INNER WHERE IS_LEAF = 1 -- 这个条件找出所有的叶子

CHILD           C_QTY

---------- ----------

E                10,8

Z                   3

不用PRO_AGG的方法:

不用 PROD_AGG的办法:

SELECT CHILD

,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))

FROM BOM

CONNECT BY PRIOR PARENT=CHILD

START WITH CHILD = inner.CHILD -- 从每个叶子开始

) AS C_QTY

FROM (SELECT BOM.*

,CONNECT_BY_ISLEAF AS IS_LEAF

FROM BOM

CONNECT BY PRIOR CHILD = PARENT

START WITH PARENT='A'

) inner

WHERE IS_LEAF=1; -- 这个条件找出所有的叶子

3、使用PL/SQL的方法:可以将1替换为connect_by_isleaf:如果为叶子节点,则该函数的值1,否则为0,刚好可以替代1,

SELECT CHILD, GET_EXPRESSION_RSLT(CON_QTY)

FROM (SELECT CHILD,

LEVEL M,

1 || SYS_CONNECT_BY_PATH(C_QTY / P_QTY, '*') CON_QTY

FROM BOM

WHERE CONNECT_BY_ISLEAF = 1

START WITH PARENT = 'A'

CONNECT BY PARENT = PRIOR CHILD) A

结果:

1 E 10.8

2 F 3.85714285714285714285714285714285714287

3 Z 3

自定义函数:

CREATE OR REPLACE FUNCTION GET_EXPRESSION_RSLT(I_EXPRESSION VARCHAR2) RETURN VARCHAR2 IS

/************************************************************

* 函数名称:GET_EXPRESSION_RSLT

* 功能描述:获取指定的表达式的结果

* 参数:I_EXPRESSION :表达式 例如:1*2*3

* 编 写 人:XXX

* 编写时间:XXXX-XX-XX

* 修改记录:

*************************************************************/

RETURNSTR VARCHAR2(500) := '';

EXECSQL VARCHAR2(4000) := '';

BEGIN

EXECSQL := ' SELECT ' || I_EXPRESSION || ' FROM DUAL';

EXECUTE IMMEDIATE (EXECSQL)

INTO RETURNSTR;

RETURN RETURNSTR;

END;

如果要看A用了每个B,C,D,E

则只需要将CONNECT_BY_SILEFT=1去掉即可

也可以使用下面的语句:

SELECT CHILD, dbms_aw.eval_number(CON_QTY)

FROM (SELECT CHILD,

LEVEL M,

1 || SYS_CONNECT_BY_PATH(C_QTY / P_QTY, '*') CON_QTY

FROM BOM

WHERE CONNECT_BY_ISLEAF = 1

START WITH PARENT = 'A'

CONNECT BY PARENT = PRIOR CHILD) A

其中dbms_aw.eval_number这个函数是用来解析字符串函数的

或者使用with函数

WITH H AS

(SELECT SYS_CONNECT_BY_PATH(CHILD, '/') NAVPATH,

CHILD,

QUANTITY QTY,

ISLEAF

FROM ITEMHIER

START WITH PARENT = 'ASSY001'

CONNECT BY PRIOR CHILD = PARENT)

SELECT H1.NAVPATH, H1.CHILD,(

SELECT /*EXP(SUM(LN(H2.QTY))),*/

POWER(10, SUM(LOG(10, QTY)))

FROM H H2

WHERE INSTR(H1.NAVPATH, H2.NAVPATH) = 1) QTY

FROM H H1

WHERE ISLEAF = 1

A&ast; 寻路算法&lbrack;转载&rsqb;

oracle bom展开 sql,展开BOM并使用最终用量的算法(转载)相关推荐

  1. oracle planning bom,OracleERP表结构--BOM模块

    BOM模块常用表结构 表名: bom.bom_bill_of_materials 说明: BOM清单父项目 BILL_SEQUENCE_ID NUMBER 清单序号(关键字) ASSEMBLY_ITE ...

  2. ORACLE中高效SQL的写法

    目录 1.  书写格式规范  1-1.大小文字及空格的统一  1-2.日期格式明确化  1-3.Bind变量的使用  1-4.表别名的使用  1-5.检索时尽量避免检索不需要的列  1-6.ORDER ...

  3. 使用Microsoft数据迁移助手在Oracle数据库和SQL Server之间迁移的具体示例

    介绍 (Introduction) Intended audience 目标听众 This document is intended for application developers and da ...

  4. 订单BOM -销售BOM-标准BOM

    订单BOM -销售BOM-标准BOM 订单BOM: 是实际生产时使用的BOM, 在标准BOM和销售BOM基础上增减物料的BOM: 销售BOM: 是为特定客户设定的BOM, 在主档数据层次上的BOM, ...

  5. oracle写SQL快捷键,Oracle数据库PL/SQL快捷键设置详解

    Oracle数据库中,PL/SQL设置快捷键的方法是本文我们主要要介绍的内容,了解了这些设置可以是我们更效率地使用Oracle数据库,接下来就让我们一起来了解一下这部分内容吧. 1.登录后默认自动选中 ...

  6. Oracle在Pl/sql中的存储过程----zhoudianzhang

    Oracle 存储过程 目录 Oracle 存储过程... 1 Oracle存储过程基础知识... 1 Oracle存储过程的基本语法... 2 关于Oracle存储过程的若干问题备忘... 4 1. ...

  7. 生产订单BOM、销售订单BOM、标准BOM

    生产订单BOM.销售订单BOM.标准BOM 生产订单BOM.销售订单BOM.标准BOM 生产订单BOM ,跑生产订单时,子组件体现作用 . 销售订单BOM ,跑MRP 时体现子组件的作用 . rcdf ...

  8. BOM:05- 常见的BOM形式

    1.单级展开BOM 单级展开格式显示某一装配件所使用的下级零部件.采用多个单级展开就能完整地表示产品的多级结构.对应很多企业(特别是产品零部件数量繁多的企业)的分组明细表即是单级BOM的具体形式.下表 ...

  9. oracle 当前top sql,Oracle top 查询TOP SQL

    有时Oracle数据库服务器,系统CPU爆高,通过Top命令可以查看到占用CPU最高的进程 我们需要记住前几个TOP的pid号,带入下面的SQL,到数据库中查询运行的进程.服务器.用户.SQL.等待等 ...

最新文章

  1. Oracle PL/SQL编程学习笔记:Merge方法的使用
  2. Java中映射怎么实现_我们如何在Java 9的JShell中实现映射?
  3. python turtle画熊-用Python Turtle 画可爱的熊猫
  4. 动态的添加和丢弃关键点---32
  5. java实现次方的运算_Java中对于位运算的优化以及运用与思考
  6. 移动端 IP 优选方案
  7. c语言下列循环的循环次数,在C语言中,若i=3,则语句 while (i) { i--; break;}的循环次数为 答案:1...
  8. (44)System Verilog数组逻辑运算
  9. yum配置(源配置-光驱,ftp服务器;基本用法)
  10. 为什么显卡更新换代极快,每年都会有更强的新系列,而声卡却永远停留在了“兼容DX9的集成声卡“?
  11. 2020最新android教程,Android教程2020
  12. Ubuntu 下 MySQL 数据自执行备份
  13. 仿宋GB_2312字体在wps,office中的安装下载使用
  14. 在 Microsoft Windows Server 2008 R2 上安装 IE 11
  15. 哔哩哔哩 2019秋招编程题---脸滚键盘
  16. python布尔系列_python-布尔运算
  17. 能帮我看看那里错了吗
  18. c语言tab什么意思_C语言入门学好这一篇就足够了!C语言所有的知识点
  19. 零基础程序员自学编程有这 6 种方法,你的自学方法是合理的么?
  20. (附源码)计算机毕业设计SSM旅游足迹分享系统

热门文章

  1. java编写hot_类的热加载(Hot Deployment)的简单例子
  2. 057_《Delphi住宿餐饮管理系统开发实例导航》
  3. Unity实现简易打飞碟(Hit UFO)
  4. ABAP自动生成程序
  5. 未来5年,视频剪辑是最适合男性的副业!
  6. Element-Ui组件 icon图标
  7. 吉林省计算机水平考试试题,2015吉林省计算机等级考试试题 二级ACCESS必过技巧...
  8. 信息增益、信息增益率、gini、特征选择、决策树
  9. 【NOIp2019模拟】题解
  10. Python实现Collatz序列(考拉兹猜想)