楼主: jvkojvko

[精华] 对BOM展开并计算最终使用量的解答

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
71#
发表于 2016-9-9 21:49 | 只看该作者
如果你用的是11.2以上版本,可以用递归WITH更加简单:

WITH bom1 AS( SELECT 'a' PARENT, 'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'b' PARENT, 'c' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'b' PARENT, 'g' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'c' PARENT, 'd' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'a' PARENT, 'e' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'e' PARENT, 'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'e' PARENT, 'f' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'a' PARENT, 'h' CHILD, 1 P_QTY, 2 C_QTY FROM dual UNION ALL
              SELECT 'a1' PARENT,'b' CHILD, 1 P_QTY, 2 C_QTY FROM dual
               ),
t(root,parent,child,qty) AS (
SELECT parent as root,parent,child,c_qty/p_qty qty from bom1 where PARENT IN ('a','a1')   
UNION ALL
SELECT t.root,b.parent,b.child,t.qty*b.c_qty/b.p_qty
  FROM bom1 b,t
WHERE t.child=b.parent
)
SELECT root,child,SUM(qty)
  FROM t
WHERE NOT EXISTS (SELECT 1 FROM bom1 b WHERE b.parent = t.child)        
GROUP BY root,child

使用道具 举报

回复
论坛徽章:
0
72#
发表于 2024-1-4 14:03 | 只看该作者
newkid 发表于 2008-7-15 22:22
如果你同时要求A,B的原料数,那么起点就必须有两个,而且所有数字都要按它们来分组。修改如下:WITH vw_bom ...

太感谢了 @newkid,和我的生产环境很接近,很有用,我的大部分产品都可以用这个脚本正确的抓出来;
但是有些特殊的情况比较复杂:

INSERT INTO BOM VALUES ('A','B',1,3);
INSERT INTO BOM VALUES ('B','C',2,3);
--INSERT INTO BOM VALUES ('C','D',3,6);
INSERT INTO BOM VALUES ('C','D',3,3); --因为D里面的零件 E 有一部分变更为E1后,D的数量会相应的改变
INSERT INTO BOM VALUES ('C','D1',3,3); --原来的D,有部分变为 D1,但D+D1总数不会变
INSERT INTO BOM VALUES ('D','E',1,2);
INSERT INTO BOM VALUES ('A','Z',1,3);


INSERT INTO BOM VALUES ('D1','D',1,1);
INSERT INTO BOM VALUES ('D1','E1',1,1);
INSERT INTO BOM VALUES ('D1','E',1,-1);

也是要求所有零件的用量,数据库也是 oracle 10G
因为退料的原因存在负数,用对数就没办法处理了,请问还有什么比较好的办法处理吗?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
73#
发表于 2024-1-4 23:06 | 只看该作者
palit111 发表于 2024-1-4 14:03
太感谢了 @newkid,和我的生产环境很接近,很有用,我的大部分产品都可以用这个脚本正确的抓出来;但是有些 ...

你必须给出CREATE TABLE语句,并说明每个列的含义。你的前两个列看起来像父子ID, 但是第三第四分别起什么作用就不得而知。

最后还要给出你这个小例子的预期结果,说明这个结果是怎么得到的。

至于负数可以用本贴5楼提到的自定义乘法聚合函数去算。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表