BOM各层级计算真实用量

八月十八 2020-11-30 04:09:34
急急急!!!求大神指教

SELECT * FROM (
select 级别='1',A='A1',B='B1',用量='1',B真实用量='' UNION ALL
select 级别='2',A='B1',B='C1',用量='2',B真实用量='' UNION ALL
select 级别='3',A='C1',B='D1',用量='3',B真实用量='' UNION ALL
select 级别='3',A='C1',B='D2',用量='2',B真实用量='' UNION ALL
select 级别='3',A='C1',B='D3',用量='2',B真实用量='' UNION ALL
select 级别='3',A='C1',B='D4',用量='5',B真实用量='' UNION ALL
select 级别='4',A='D1',B='E1',用量='9',B真实用量='' UNION ALL
select 级别='4',A='D2',B='E2',用量='5',B真实用量='' ) #t


例如:
这里有 A1-B1-C1-D1-E1 要结果 A1-B1-C1-D1-E1
1 2 3 9 1 2 6 54
例如:
这里有 A1-B1-C1-D2-E2 要结果 A1-B1-C1-D2-E2
1 2 2 5 1 2 4 20


当级别高的行字段B等于级别低的行字段A时,将两行用量相乘放入低级别B字段对应的B真实用量中,若在一条流程里级别多了需要滚动相乘,如例子(级别数字越小级别越高)

要的结果如下:



...全文
1057 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2020-12-01
  • 打赏
  • 举报
回复
通常BOM的关系是一个上级对应一个或者多个下级,不在上级记录下级是谁,而是在下级记录上级是谁(一般是parentID),这样一层层展开就可以了。 按你的数据来计算可以参考:

SELECT * INTO #t FROM (
select 级别= 1 ,A='A1',B='B1',用量= 1 ,B真实用量=null UNION ALL
select 级别= 2 ,A='B1',B='C1',用量= 2 ,B真实用量=null UNION ALL
select 级别= 3 ,A='C1',B='D1',用量= 3 ,B真实用量=null UNION ALL
select 级别= 3 ,A='C1',B='D2',用量= 2 ,B真实用量=null UNION ALL
select 级别= 3 ,A='C1',B='D3',用量= 2 ,B真实用量=null UNION ALL
select 级别= 3 ,A='C1',B='D4',用量= 5 ,B真实用量=null UNION ALL
select 级别= 4 ,A='D1',B='E1',用量= 9 ,B真实用量=null UNION ALL
select 级别= 4 ,A='D2',B='E2',用量= 5 ,B真实用量=null ) t

;WITH list AS (SELECT   级别, A, B, 用量, B真实用量 = 用量 FROM   #t WHERE 级别 = 1
               UNION ALL
               SELECT   t.级别, t.A, t.B, t.用量, l.B真实用量 * t.用量
               FROM     #t t
                        INNER JOIN list l ON l.级别 = t.级别 - 1 AND l.B = t.A)
SELECT  * FROM  list ORDER BY   list.级别, list.A;
八月十八 2020-12-01
  • 打赏
  • 举报
回复
引用 3 楼 Hello World, 的回复:
你这个BOM设计挺别致啊,一个A下来,可能用4个C也可能用6个C,确定是这样的?
应该是不会有重复的,附上一张图您看下,他是有对应的路线的,前面高级母件的值只会影响后面低级的母件的值。
八月十八 2020-12-01
  • 打赏
  • 举报
回复
引用 2 楼 RINK_1 的回复:

WITH CTE
AS
(SELECT *,QTY AS NEW_QTY FROM #T A
WHERE NOT EXISTS (SELECT 1 FROM #T WHERE LEVEL<A.LEVEL AND B=A.A)
 UNION ALL
 SELECT A.*,B.NEW_QTY*A.QTY
 FROM #T A 
 JOIN CTE B ON A.A=B.B
 WHERE A.LEVEL>B.LEVEL)

 SELECT * FROM CTE
 ORDER BY LEVEL,A
这个是不是oracle的用法,能不能用SQL server的语法来处理?
Hello World, 2020-12-01
  • 打赏
  • 举报
回复
你这个BOM设计挺别致啊,一个A下来,可能用4个C也可能用6个C,确定是这样的?
RINK_1 2020-11-30
  • 打赏
  • 举报
回复

WITH CTE
AS
(SELECT *,QTY AS NEW_QTY FROM #T A
WHERE NOT EXISTS (SELECT 1 FROM #T WHERE LEVEL<A.LEVEL AND B=A.A)
 UNION ALL
 SELECT A.*,B.NEW_QTY*A.QTY
 FROM #T A 
 JOIN CTE B ON A.A=B.B
 WHERE A.LEVEL>B.LEVEL)

 SELECT * FROM CTE
 ORDER BY LEVEL,A
八月十八 2020-11-30
  • 打赏
  • 举报
回复 1
自己再来顶一下

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧