楼主: jvkojvko

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

[复制链接]
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
21#
发表于 2008-7-13 21:02 | 只看该作者
是的,加大难度。这次在D半成品下追加一个F,在B半成品下追加一个H,

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
4            D            F         1                       3
2            B            H         1                       3
1            X            Y         1                       3
2            Y            V         2                       3
2            Y            Z         2                       5
3            Z            M         2                      5

太乱了,现在要求能够通过一个SQL,计算出做一个A,需要多少个E,Z,F,H,计算一个X,需要多少个V,M。
                  
不过关键问题已经解决,这个只不过是分组的事情了。

原帖由 grubbyoo 于 2008-7-13 20:26 发表
加大难度  半成品B 需要另一个材料 F

我觉得更接近需求

[ 本帖最后由 lypch 于 2008-7-13 21:10 编辑 ]

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
22#
发表于 2008-7-13 21:04 | 只看该作者
真的很牛,Newkid,小弟刚开始学习Oracle PL/SQL的编程目前环境是10g,想找一本提高的书籍,推荐一下。谢谢

原帖由 newkid 于 2008-7-13 02:58 发表
PROD_AGG 见:
http://www.itpub.net/thread-1020772-1-1.html

不用 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;      -- 这个条件找出所有的叶子

使用道具 举报

回复
论坛徽章:
9607
土豪章
日期:2013-12-31 14:11:39土豪章
日期:2013-12-31 14:11:39阿森纳
日期:2013-06-03 17:00:31阿森纳
日期:2013-10-11 09:27:58法拉利
日期:2013-12-27 15:20:30林肯
日期:2013-12-27 15:19:09法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30
23#
 楼主| 发表于 2008-7-13 21:07 | 只看该作者
原帖由 lypch 于 2008-7-13 21:02 发表
是的,加大难度。不过我想 NewID的算法应该已经能够计算出来了。呵呵

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
4            D            F         1                       3
2            B            H         1                       3




加上去我的算法没有问题啊

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
24#
发表于 2008-7-13 21:21 | 只看该作者
小马哥,我不是说你的算法有问题, 我是说yangtingkun提到的方法局限性太大了。呵呵


原帖由 jvkojvko 于 2008-7-13 21:07 发表


加上去我的算法没有问题啊

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2008-7-13 21:33 | 只看该作者
对数反对数的办法不错,但不知道有没有舍入误差的问题?
to lypch: 很抱歉我没有什么PL/SQL的书推荐,自己都是在实践中学的(我做了10+年PL/SQL)
有什么问题的话多交流,在学习中进步!

使用道具 举报

回复
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:252013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-11-29 06:00:13
26#
发表于 2008-7-13 23:01 | 只看该作者
太强了。10年了啊。不知道你是使用什么工具进行开发的?MSN有吗?
如果不方便也没有关系。呵呵呵

原帖由 newkid 于 2008-7-13 21:33 发表
对数反对数的办法不错,但不知道有没有舍入误差的问题?
to lypch: 很抱歉我没有什么PL/SQL的书推荐,自己都是在实践中学的(我做了10+年PL/SQL)
有什么问题的话多交流,在学习中进步!

使用道具 举报

回复
论坛徽章:
44
2010新春纪念徽章
日期:2013-08-14 18:08:57ITPUB 11周年纪念徽章
日期:2013-08-16 08:17:47ITPUB 11周年纪念徽章
日期:2013-08-14 18:08:57ITPUB 11周年纪念徽章
日期:2013-08-26 22:01:43ITPUB 11周年纪念徽章
日期:2013-08-12 23:19:35ITPUB 11周年纪念徽章
日期:2013-08-23 09:24:33ITPUB 11周年纪念徽章
日期:2013-08-23 09:24:33ITPUB 11周年纪念徽章
日期:2013-08-23 09:24:33ITPUB 11周年纪念徽章
日期:2013-08-23 09:24:33ITPUB 11周年纪念徽章
日期:2013-08-15 23:00:23
27#
发表于 2008-7-14 08:35 | 只看该作者
好好学习,研究研究

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
28#
发表于 2008-7-14 09:54 | 只看该作者
以上是10G的解决办法.我用的是9I的,因此有两个问题还请高手解答:
1.9I的解决办法.
2.如果同一原料在多个层次中使用上述语句是否行得通?(比如我们就有这样的问题,
  一些小部件如螺丝之类的就会在不同的层次中出现.)即插入记录:
  insert into t_level values(4,'D','Z',1,4);
谢谢

使用道具 举报

回复
论坛徽章:
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
29#
发表于 2008-7-14 10:41 | 只看该作者
稍微改了一下,你帮我验证吧:

SELECT CHILD
      ,SUM(C_QTY) AS C_QTY       -- 解决叶子(原料)不唯一
  FROM (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     -- 从每个叶子开始
                            AND PARENT = inner.PARENT    -- 解决叶子(原料)不唯一
                ) AS C_QTY
        FROM (SELECT b.*
                FROM BOM b
               WHERE NOT EXISTS (SELECT 1 FROM BOM WHERE parent = b.child) --解决 9i 没有CONNECT_BY_ISLEAF
                CONNECT BY PRIOR CHILD = PARENT
               START WITH PARENT='A'
             ) inner
      )
GROUP BY CHILD;

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
30#
发表于 2008-7-14 11:34 | 只看该作者
原帖由 newkid 于 2008-7-14 10:41 发表
稍微改了一下,你帮我验证吧:

SELECT CHILD
      ,SUM(C_QTY) AS C_QTY       -- 解决叶子(原料)不唯一
  FROM (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     -- 从每个叶子开始
                            AND PARENT = inner.PARENT    -- 解决叶子(原料)不唯一
                ) AS C_QTY
        FROM (SELECT b.*
                FROM BOM b
               WHERE NOT EXISTS (SELECT 1 FROM BOM WHERE parent = b.child) --解决 9i 没有CONNECT_BY_ISLEAF
                CONNECT BY PRIOR CHILD = PARENT
               START WITH PARENT='A'
             ) inner
      )
GROUP BY CHILD;


ORACLE9204下测试顺利通过,结果是对的.
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);
insert into BOM values('D','Z',1,4);
select * from bom
SELECT CHILD
      ,SUM(C_QTY) AS C_QTY       -- ½â¾öÒ¶×Ó£¨Ô ÁÏ£©²»Î¨Ò»
  FROM (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     -- ´Óÿ¸öÒ¶×Ó¿ªÊ¼
                            AND PARENT = inner.PARENT    -- ½â¾öÒ¶×Ó£¨Ô ÁÏ£©²»Î¨Ò»
                ) AS C_QTY
        FROM (SELECT b.*
                FROM BOM b
               WHERE NOT EXISTS (SELECT 1 FROM BOM WHERE parent = b.child) --½â¾ö 9i ûÓÐCONNECT_BY_ISLEAF
                CONNECT BY PRIOR CHILD = PARENT
               START WITH PARENT='A'
             ) inner
      )
GROUP BY CHILD

RETURN:
E  10.8   --(3*3/2*6/5*2)
Z   24.6  --(3*3/2*6/5*4+3)
谢谢NEWKID

使用道具 举报

回复

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

本版积分规则 发表回复

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