SQL疑难请教

newqq 2018-09-19 10:41:02
BOM 结构

A

B C

D
A是成品,B是半成品,C和D是原材料

--BOM 展开后的表(此部分已经实现)
CREATE TABLE [dbo].[TMP_BOM]
(
[母件编码] [varchar] (100) ,
[子件编码] [varchar] (100) ,
[基本用量] [float] NULL,
[cpath] [varchar] (1000) ,
) ON [PRIMARY]
GO
INSERT INTO dbo.TMP_BOM ( 母件编码, 子件编码, 基本用量, cpath)
SELECT 'A', 'B', 1, '10' UNION
SELECT 'A', 'C', 1, '20' UNION
SELECT 'A', 'D', 2, '10-10'


--库存表
CREATE TABLE tmp_kc(物料编码 VARCHAR(50),数量 int)
INSERT INTO dbo.tmp_kc ( 物料编码, 数量 )
SELECT 'A',10 UNION
SELECT 'B',20
SELECT 'D',10

--想要的效果
--输入产品(A)数量100,首先扣减库存表中的产品A的数量 10,得出A欠料90
--半成品B欠料数量90减去库存20,得出B欠料70
--原材料D欠料70*2-减去库存10,得出欠料130
--原材料C欠料90
...全文
286 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
newqq 2018-09-19
  • 打赏
  • 举报
回复
分配之后A的需求就是90,同时B的需求也变成90
newqq 2018-09-19
  • 打赏
  • 举报
回复
因为A的数量分配了10个库存,B的需求是根据A的来的
RINK_1 2018-09-19
  • 打赏
  • 举报
回复
B的需求数量为什么是90而不是100,A和B的数量对应不是1:1吗
newqq 2018-09-19
  • 打赏
  • 举报
回复
等待大神。。。。。。。。。。。。。。。。。
newqq 2018-09-19
  • 打赏
  • 举报
回复
没有库存就不分配,那就算是欠料
RINK_1 2018-09-19
  • 打赏
  • 举报
回复
引用 8 楼 newqq 的回复:
感谢大神,好像有点问题,D的欠料没算出来,另外多个BOM的时候算出来也不对, 再插入一些数据 INSERT INTO dbo.TMP_BOM ( 母件编码, 子件编码, 基本用量, cpath) SELECT 'Q', 'B', 1, '10' UNION SELECT 'Q', 'C', 1, '20' UNION SELECT 'Q', 'D', 2, '10-10' --库存表 INSERT INTO dbo.tmp_kc ( 物料编码, 数量 ) SELECT 'Q',10 UNION SELECT 'B',20 SELECT 'D',10
你每次不是只输入1个成品的产量进行计算的吗?如果多个成品那就复杂了,还要根据成品的顺序循环计算半成品和原料的库存和欠料了。 D的欠料没出来?你给的测试表的插入语句有问题,库存表中D没有插入。
newqq 2018-09-19
  • 打赏
  • 举报
回复
感谢大神,好像有点问题,D的欠料没算出来,另外多个BOM的时候算出来也不对, 再插入一些数据 INSERT INTO dbo.TMP_BOM ( 母件编码, 子件编码, 基本用量, cpath) SELECT 'Q', 'B', 1, '10' UNION SELECT 'Q', 'C', 1, '20' UNION SELECT 'Q', 'D', 2, '10-10' --库存表 INSERT INTO dbo.tmp_kc ( 物料编码, 数量 ) SELECT 'Q',10 UNION SELECT 'B',20 SELECT 'D',10
RINK_1 2018-09-19
  • 打赏
  • 举报
回复
引用 5 楼 RINK_1 的回复:
[quote=引用 3 楼 newqq 的回复:] 因为A的数量分配了10个库存,B的需求是根据A的来的
嗯,理解了,成品的库存就是现成有的,不需要再生产了,所以后续的需求就是在成品的欠料基础上开始计算的。 你这个得用到递归了。[/quote] 你这个BOM表为什么不用“母件编码”和“子件编码”来体现上下级的关系(比如B和D的关系),而要再额外通过cpath这个字段来体现,而且还是10-10这种有些歧义的值来表示。


with cte_1
as
(select A.*,B.数量 as 库存,100-B.数量 as 欠料
from
(select top 1 母件编码,母件编码 as 子件编码,1 as 基本用量,cpath,100 as 需求数量 from TMP_BOM order by cpath) as A
join tmp_kc B on A.母件编码=B.物料编码),

cte_2
as 
(select B.*,A.欠料 as 需求数量,isnull(C.数量,0) as 库存,A.欠料-isnull(C.数量,0) as 欠料
 from cte_1 as A
 join TMP_BOM as B on A.母件编码=B.母件编码
 left join tmp_kc C on B.子件编码=C.物料编码
 where charindex('-',B.cpath)=0),

cte_3
as
(select * from cte_2 
 union all
 select B.母件编码, B.子件编码, B.基本用量, B.cpath,A.欠料*B.基本用量,B.数量,A.欠料*B.基本用量-B.数量
 from cte_2 as A
 join 
 (select A.*,B.数量 from TMP_BOM A
  left join tmp_kc B on A.子件编码=B.物料编码
  where charindex('-',A.cpath)<>0) as B
  on B.cpath like A.cpath+'-%')

select * from cte_1
union all
select * from cte_3
newqq 2018-09-19
  • 打赏
  • 举报
回复
CSDN现在的广告很恶心
RINK_1 2018-09-19
  • 打赏
  • 举报
回复
引用 3 楼 newqq 的回复:
因为A的数量分配了10个库存,B的需求是根据A的来的
嗯,理解了,成品的库存就是现成有的,不需要再生产了,所以后续的需求就是在成品的欠料基础上开始计算的。 你这个得用到递归了。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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