楼主: jvkojvko

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

[复制链接]
论坛徽章:
86
奥运会纪念徽章:柔道
日期:2016-10-30 22:33:42奥运会纪念徽章:足球
日期:2016-10-30 22:33:42奥运会纪念徽章:蹦床
日期:2016-10-30 22:33:42奥运会纪念徽章:跆拳道
日期:2016-10-30 22:33:42奥运会纪念徽章:自行车
日期:2016-10-30 22:33:42奥运会纪念徽章:拳击
日期:2016-10-30 22:33:42奥运会纪念徽章:篮球
日期:2016-10-30 22:33:42奥运会纪念徽章:柔道
日期:2016-10-30 22:33:42奥运会纪念徽章:帆船
日期:2016-10-30 22:33:42奥运会纪念徽章:沙滩排球
日期:2016-10-30 22:33:42
61#
发表于 2008-7-17 11:47 | 只看该作者
帮顶!

使用道具 举报

回复
论坛徽章:
83
生肖徽章2007版:羊
日期:2009-03-18 14:00:34生肖徽章2007版:羊
日期:2009-02-28 10:00:44生肖徽章2007版:羊
日期:2009-03-20 14:47:19生肖徽章2007版:羊
日期:2009-03-22 11:39:08生肖徽章2007版:羊
日期:2009-03-23 14:01:04生肖徽章2007版:羊
日期:2009-06-12 12:46:14生肖徽章:羊
日期:2007-09-26 17:02:21生肖徽章:羊
日期:2007-09-26 17:02:14生肖徽章:羊
日期:2007-09-26 17:02:07生肖徽章:羊
日期:2007-09-26 12:34:37
62#
发表于 2008-7-17 12:07 | 只看该作者
原来你还有工作的啊!不是只混水的啊!

使用道具 举报

回复
论坛徽章:
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
63#
发表于 2008-7-17 12:15 | 只看该作者
受益匪浅

使用道具 举报

回复
论坛徽章:
548
金牌徽章
日期:2008-09-04 11:32:50金牌徽章
日期:2012-08-15 14:07:24金牌徽章
日期:2012-08-15 14:48:00银牌徽章
日期:2012-08-21 14:55:12银牌徽章
日期:2012-08-15 13:40:21铜牌徽章
日期:2012-08-15 14:07:242012欧洲杯之星
日期:2012-07-02 14:16:292012欧洲杯之星
日期:2012-08-15 14:48:002012欧洲杯之星
日期:2012-06-25 16:51:11NBA之星
日期:2010-04-15 14:14:34
64#
发表于 2008-7-17 12:44 | 只看该作者
哈哈哈
恭喜受精了啊

使用道具 举报

回复
论坛徽章:
0
65#
发表于 2008-8-16 15:16 | 只看该作者
ORACLE EBS的BOM上也有这个问题,前几天我作一报表计算机BOM物料成本,需要把BOM展开
我写了一个递归函数,效果还不错
庆幸的是BOM层次不多,执行效率还可以
两万条记录用了不到五秒钟

不过总觉得用递归函数还是不太合适,前些天也发帖求助,现在还没明确答复

看了楼上的讨论,有点启示,不过有些语法还看不太明白,继续研究ing...

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
66#
发表于 2008-8-16 18:34 | 只看该作者
学习了

使用道具 举报

回复
论坛徽章:
10
生肖徽章2007版:马
日期:2008-09-21 12:37:06ITPUB9周年纪念徽章
日期:2010-10-08 09:34:022010新春纪念徽章
日期:2010-03-01 11:07:212009日食纪念
日期:2009-07-22 09:30:00ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:45八级虎吧徽章
日期:2008-12-08 16:10:57每日论坛发贴之星
日期:2008-10-06 01:01:54授权会员
日期:2008-09-28 22:57:33生肖徽章2007版:马
日期:2008-09-26 23:20:07IT宝贝
日期:2010-10-14 10:32:51
67#
发表于 2008-10-3 19:06 | 只看该作者
路过  不错的帖子

使用道具 举报

回复
论坛徽章:
164
山治
日期:2016-11-16 15:57:38马上有房
日期:2014-10-20 22:50:18马上有钱
日期:2014-10-15 21:23:27马上有对象
日期:2014-10-11 13:07:56itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46
68#
发表于 2016-9-8 14:52 | 只看该作者
本帖最后由 myoekk 于 2016-9-8 15:12 编辑
newkid 发表于 2008-7-15 22:22
如果你同时要求A,B的原料数,那么起点就必须有两个,而且所有数字都要按它们来分组。修改如下:

WITH vw ...

小弟在引用大神这段语句时,多加了几层BOM结构测试,就是非叶子节点不唯一的情况,算出来的原料数量有点问题,这种情况该怎么处理,下面是结果有问题的例子,还望大神指导一下:
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
                          ),
vw_bom AS (SELECT DISTINCT b.*,CONNECT_BY_ROOT(parent) AS ROOT
                FROM bom1 b
                CONNECT BY PRIOR CHILD = PARENT
               START WITH PARENT IN ('a','a1')
               )
SELECT ROOT
      ,CHILD
      ,SUM(C_QTY) AS C_QTY       -- 解决叶子(原料)不唯一
  FROM (SELECT ROOT
              ,CHILD
              ,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))
                  FROM vw_bom
               CONNECT BY PRIOR PARENT=CHILD AND ROOT = inner.ROOT
                 START WITH CHILD = inner.CHILD     -- 从每个叶子开始
                            AND PARENT = inner.PARENT    -- 解决叶子(原料)不唯一
                            AND ROOT = inner.ROOT
                ) AS C_QTY
        FROM vw_bom inner
       WHERE NOT EXISTS (SELECT 1 FROM vw_bom WHERE parent = inner.child)
      )
GROUP BY ROOT,CHILD;
结果:
RO C      C_QTY
-- - ----------
a  h          2
a  f          4
a  d         32
a  g         16
a1 g          4
a1 d          8
其中 a 用 d 32个,手算出来是24,a 用 g 16个,手算是12个。

使用道具 举报

回复
论坛徽章:
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
69#
发表于 2016-9-8 22:41 | 只看该作者
myoekk 发表于 2016-9-8 14:52
小弟在引用大神这段语句时,多加了几层BOM结构测试,就是非叶子节点不唯一的情况,算出来的原料数量有点 ...

你这个已经是图不是树了,应该用路径去匹配:

           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
                          ),
vw_bom AS (SELECT  b.*,CONNECT_BY_ROOT(parent) AS ROOT,sys_connect_by_path(child,',') as path
                FROM bom1 b
                CONNECT BY PRIOR CHILD = PARENT
               START WITH PARENT IN ('a','a1')
               )
SELECT ROOT,CHILD,SUM(C_QTY) FROM (
        SELECT ROOT
              ,CHILD
              ,(SELECT POWER(10,SUM(LOG(10,C_QTY)))/POWER(10,SUM(LOG(10,P_QTY)))
                  FROM vw_bom
               CONNECT BY PRIOR PATH=path||','||PRIOR CHILD AND ROOT = inner.ROOT
                 START WITH PATH = inner.PATH     -- 从每个叶子开始
                            --AND PARENT = inner.PARENT    -- 解决叶子(原料)不唯一
                            AND ROOT = inner.ROOT
                ) AS C_QTY
        FROM vw_bom inner
       WHERE NOT EXISTS (SELECT 1 FROM vw_bom WHERE parent = inner.child)
)        
GROUP BY ROOT,CHILD

使用道具 举报

回复
论坛徽章:
164
山治
日期:2016-11-16 15:57:38马上有房
日期:2014-10-20 22:50:18马上有钱
日期:2014-10-15 21:23:27马上有对象
日期:2014-10-11 13:07:56itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46itpub13周年纪念徽章
日期:2014-10-08 15:20:46
70#
发表于 2016-9-9 09:41 | 只看该作者
newkid 发表于 2016-9-8 22:41
你这个已经是图不是树了,应该用路径去匹配:

           WITH bom1 AS( SELECT 'a' PARENT, 'b' CHIL ...

好强悍的大神,膜拜!
偶尔有些产品不是直接从原材料一步到位生产出来,而是分不同部件生产出来放仓库,然后根据需要组装成产品。不同部件又可能含有相同的组件,组件由原材料生产而来。之前一直找不到能准确得到原材料的使用量的SQL语句。
感谢大神指导!

使用道具 举报

回复

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

本版积分规则 发表回复

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