这个BOM表的sql语句怎么写,在线等?

sdweihailh 2008-06-17 07:55:28
有BOM表。假如成品1个A 由 2个B (类型为N), 3个C(类型为M),2个D组成 (类型为M),类型为M的表示半成品,
M类型的下边还有结构,类型为N的表示原料,下边无结构。
半成品C由 1个C1,1个C2组成,类型为N,1个C3组成,类型为M,C3由2个C3A,1个C3B
组成,类型为N.1个D由1个D1和1个D2组成,类型为N. 目前数据库的BOM表结构如下

主件品号 子件品号 类型 数量
A B N 2
A C M 3
C C1 N 1
C C2 N 1
C C3 M 1
C3 C3A N 2
C3 C3B N 1
D D1 N 1
D D2 N 1
我想通过此表得出1个A是由多少个N组成的,就是单层的BOM清单:
也就是下面的结果:
层 主件品号 子件品号 类型 数量

1 A B N 2
1 A C M 3
2 A C1 N 3*1
2 A C2 N 3*1
2 A C3 M 3*1
3 A C3A N 3*1*2
3 A C3B N 3*1*2
1 A D M 2
2 A D1 N 2*1
2 A D2 N 2*1
实际结构A可能有多个M类的组成,像我举例第一层只是两个M类的,第二层也有
可能是多个M类的,请问高手SQL语句怎么写?不够分再加。
...全文
150 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdweihailh 2008-06-18
  • 打赏
  • 举报
回复
我想要的正是这个union all 的过程。这个表里存储很多的数据,不光有成品A的,还有很多其他的,要按照主件品号为条件,往下推的,得到A的结构。
-晴天 2008-06-17
  • 打赏
  • 举报
回复
这只能用于三层,如果有更多层,则要再嵌套下去.
-晴天 2008-06-17
  • 打赏
  • 举报
回复
为了确证,增加了一行数据:
create table #T(m varchar(5),s varchar(5),c varchar(5), n int)
insert into #T select 'A','B','N',2
union all select 'A','C','M',3
union all select 'A','D','M',2
union all select 'C','C1','N',1
union all select 'C','C2','N',1
union all select 'C','C3','M',1
union all select 'C3','C3A','N',2
union all select 'C3','C3B','N',1
union all select 'D','D1','N',1
union all select 'D','D2','M',1
union all select 'D2','D2A','N',2
go
select c.m,c.s,c.s1,d.s as s2,(case when c.c='M' then c.n*d.n else c.n end) as n
from (
select a.m,a.s,b.s as s1,b.c,(case when a.c='M' then a.n*b.n else a.n end) as n
from (select m,s,c,n from #T where m='A') a left join #T b on a.s=b.m
)c left join #T d on d.m=c.s1
go
drop table #T

/*
m s s1 s2 n
----- ----- ----- ----- -----------
A B NULL NULL 2
A C C1 NULL 3
A C C2 NULL 3
A C C3 C3A 6
A C C3 C3B 3
A D D1 NULL 2
A D D2 D2A 4

(7 行受影响)

*/
pt1314917 2008-06-17
  • 打赏
  • 举报
回复

create table ss(主件品号 varchar(2),子件品号 varchar(3),类型 varchar(1),数量 varchar(10))
insert into ss
select 'A','B','N',2 union all
select 'A','C','M',3 union all
select 'C','C1','N',1 union all
select 'C','C2','N',1 union all
select 'C','C3','M',1 union all
select 'C3','C3A','N',2 union all
select 'C3','C3B','N',1 union all
select 'A','D','M',2 union all
select 'D','D1','N',1 union all
select 'D','D2','N',1
go

create proc p_ss
as
select id=identity(int,1,1),* into #ss from ss
DECLARE @i int,@j int
set @i=0
set @j=1
select @i=max(id) from #ss
while @j<=@i
begin
update #ss
set 数量=a.数量+'*'+#ss.数量
from #ss inner join #ss a on #ss.主件品号=a.子件品号
where #ss.id=@j

set @j=@j+1
end
select 层=len(数量)-len(replace(数量,'*',''))+1,主件品号,子件品号,数量 from #ss
go

exec p_ss


--结果:
层 主件品号 子件品号 类型 数量

1 A B N 2
1 A C M 3
2 A C1 N 3*1
2 A C2 N 3*1
2 A C3 M 3*1
3 A C3A N 3*1*2
3 A C3B N 3*1*1
1 A D M 2
2 A D1 N 2*1
2 A D2 N 2*1
Andy-W 2008-06-17
  • 打赏
  • 举报
回复
一个A 是由2个D组成的,M表示D是半成品,下边还有结构



主件品号 子件品号 类型 数量
A B N 2
A C M 3
C C1 N 1
C C2 N 1
C C3 M 1
C3 C3A N 2
C3 C3B N 1
D D1 N 1
D D2 N 1

没有表示A与D的关系,怎么查。
pt1314917 2008-06-17
  • 打赏
  • 举报
回复
3 A C3B N 3*1*2

那这个为什么是3*1*2了呢?不是3*1*1吗?
sdweihailh 2008-06-17
  • 打赏
  • 举报
回复
正是,确实是差一行。 A D M 2
-晴天 2008-06-17
  • 打赏
  • 举报
回复
BOM表差一行:
A D M 2
sdweihailh 2008-06-17
  • 打赏
  • 举报
回复
第二个是我想要的结果,并不存在的,只有第一个表是存在的。
-晴天 2008-06-17
  • 打赏
  • 举报
回复
D D1 N 1
D D2 N 1
我想通过此表得出1个A是由多少个N组成的,就是单层的BOM清单:
也就是下面的结果:
层 主件品号 子件品号 类型 数量


,下边还有结构。按照A查询得出A由哪些零件组成的。

是零件数还是哪些零件各有多少?
sdweihailh 2008-06-17
  • 打赏
  • 举报
回复
1 表示的是层数,是直接属于A下边的结构,所以是第一层
-晴天 2008-06-17
  • 打赏
  • 举报
回复
既然你都在结构中把每层用多少乘上去了,那只要:

select sum(数量) from bom where 主件品号='A' and 类型='N'
sdweihailh 2008-06-17
  • 打赏
  • 举报
回复
一个A 是由2个D组成的,M表示D是半成品,下边还有结构。按照A查询得出A由哪些零件组成的。
-晴天 2008-06-17
  • 打赏
  • 举报
回复
你要写什么语句?
查询,还是建表?
pt1314917 2008-06-17
  • 打赏
  • 举报
回复
1 A D M 2
这个是怎么来的?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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