oracle bom展开 sql,展开BOM并使用最终用量的算法(转载)
本文系转载子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* 寻路算法[转载]
oracle bom展开 sql,展开BOM并使用最终用量的算法(转载)相关推荐
- oracle planning bom,OracleERP表结构--BOM模块
BOM模块常用表结构 表名: bom.bom_bill_of_materials 说明: BOM清单父项目 BILL_SEQUENCE_ID NUMBER 清单序号(关键字) ASSEMBLY_ITE ...
- ORACLE中高效SQL的写法
目录 1. 书写格式规范 1-1.大小文字及空格的统一 1-2.日期格式明确化 1-3.Bind变量的使用 1-4.表别名的使用 1-5.检索时尽量避免检索不需要的列 1-6.ORDER ...
- 使用Microsoft数据迁移助手在Oracle数据库和SQL Server之间迁移的具体示例
介绍 (Introduction) Intended audience 目标听众 This document is intended for application developers and da ...
- 订单BOM -销售BOM-标准BOM
订单BOM -销售BOM-标准BOM 订单BOM: 是实际生产时使用的BOM, 在标准BOM和销售BOM基础上增减物料的BOM: 销售BOM: 是为特定客户设定的BOM, 在主档数据层次上的BOM, ...
- oracle写SQL快捷键,Oracle数据库PL/SQL快捷键设置详解
Oracle数据库中,PL/SQL设置快捷键的方法是本文我们主要要介绍的内容,了解了这些设置可以是我们更效率地使用Oracle数据库,接下来就让我们一起来了解一下这部分内容吧. 1.登录后默认自动选中 ...
- Oracle在Pl/sql中的存储过程----zhoudianzhang
Oracle 存储过程 目录 Oracle 存储过程... 1 Oracle存储过程基础知识... 1 Oracle存储过程的基本语法... 2 关于Oracle存储过程的若干问题备忘... 4 1. ...
- 生产订单BOM、销售订单BOM、标准BOM
生产订单BOM.销售订单BOM.标准BOM 生产订单BOM.销售订单BOM.标准BOM 生产订单BOM ,跑生产订单时,子组件体现作用 . 销售订单BOM ,跑MRP 时体现子组件的作用 . rcdf ...
- BOM:05- 常见的BOM形式
1.单级展开BOM 单级展开格式显示某一装配件所使用的下级零部件.采用多个单级展开就能完整地表示产品的多级结构.对应很多企业(特别是产品零部件数量繁多的企业)的分组明细表即是单级BOM的具体形式.下表 ...
- oracle 当前top sql,Oracle top 查询TOP SQL
有时Oracle数据库服务器,系统CPU爆高,通过Top命令可以查看到占用CPU最高的进程 我们需要记住前几个TOP的pid号,带入下面的SQL,到数据库中查询运行的进程.服务器.用户.SQL.等待等 ...
最新文章
- Oracle PL/SQL编程学习笔记:Merge方法的使用
- Java中映射怎么实现_我们如何在Java 9的JShell中实现映射?
- python turtle画熊-用Python Turtle 画可爱的熊猫
- 动态的添加和丢弃关键点---32
- java实现次方的运算_Java中对于位运算的优化以及运用与思考
- 移动端 IP 优选方案
- c语言下列循环的循环次数,在C语言中,若i=3,则语句 while (i) { i--; break;}的循环次数为 答案:1...
- (44)System Verilog数组逻辑运算
- yum配置(源配置-光驱,ftp服务器;基本用法)
- 为什么显卡更新换代极快,每年都会有更强的新系列,而声卡却永远停留在了“兼容DX9的集成声卡“?
- 2020最新android教程,Android教程2020
- Ubuntu 下 MySQL 数据自执行备份
- 仿宋GB_2312字体在wps,office中的安装下载使用
- 在 Microsoft Windows Server 2008 R2 上安装 IE 11
- 哔哩哔哩 2019秋招编程题---脸滚键盘
- python布尔系列_python-布尔运算
- 能帮我看看那里错了吗
- c语言tab什么意思_C语言入门学好这一篇就足够了!C语言所有的知识点
- 零基础程序员自学编程有这 6 种方法,你的自学方法是合理的么?
- (附源码)计算机毕业设计SSM旅游足迹分享系统
热门文章
- java编写hot_类的热加载(Hot Deployment)的简单例子
- 057_《Delphi住宿餐饮管理系统开发实例导航》
- Unity实现简易打飞碟(Hit UFO)
- ABAP自动生成程序
- 未来5年,视频剪辑是最适合男性的副业!
- Element-Ui组件 icon图标
- 吉林省计算机水平考试试题,2015吉林省计算机等级考试试题 二级ACCESS必过技巧...
- 信息增益、信息增益率、gini、特征选择、决策树
- 【NOIp2019模拟】题解
- Python实现Collatz序列(考拉兹猜想)