表结构:
父物料编号 父物料版本 子物料编号 子物料版本 父物料数量 子物料数量
A 1 B 1 1 2
A 1 C 1 1 1
B 1 Z 1 1 2.5
C 1 Z 1 1 3.5
B 1 M 1 1 3.2
C 1 M 1 1 1.9
需要根据输入的父物料编号和版本及数量,查询最终物料M和Z的数量!
能否快速的计算出来啊!
父物料编号 父物料版本 子物料编号 子物料版本 父物料数量 子物料数量
A 1 B 1 1 2
A 1 C 1 1 1
B 1 Z 1 1 2.5
C 1 Z 1 1 3.5
B 1 M 1 1 3.2
C 1 M 1 1 1.9
需要根据输入的父物料编号和版本及数量,查询最终物料M和Z的数量!
能否快速的计算出来啊!
解决方案 »
- Group后字段有相同数据,按另一个字段取大小,该如何写?
- 关于object_id()
- 请教一个存储过程
- 求助~~如何实现分组统计的时候,没有记录的组可以显示为0,而不是不显示
- xys_777 来接帖
- 7761098 刚才结贴快了一点,接完才看见,补分
- sql数据库安全问题
- 当sql server 中的某一个表的记录超过几十万条时 查询会出现运行超时的问题 ?
- 从外部导入了一个表,字是简体的,我们数据库上的OS是繁体的,怎么让数据不显示乱码??????
- 在vb.net中,一旦数据库中某个值改变,怎样通过前端程序通知用户?
- sql中如何将varchar类型的时间格式化为特定格式存储?
- nvarchar查询问题,如何写?在线等,TKS!
父物料编号 varchar(5),
父物料版本 int,
子物料编号 varchar(5),
子物料版本 int,
父物料数量 int,子物料数量 decimal(15,2))
insert ta select 'A', 1, 'B', 1, 1, 2
insert ta select 'A', 1, 'C', 1, 1, 1
insert ta select 'B', 1, 'Z', 1, 1, 2.5
insert ta select 'C', 1, 'Z', 1, 1, 3.5
insert ta select 'B', 1, 'M', 1, 1, 3.2
insert ta select 'C', 1, 'M', 1, 1, 1.9create function (@父物料编号 varchar(5),@父物料版本 int)
returns @ta table(父物料编号 varchar(5),
父物料版本 int,
子物料编号 varchar(5),
子物料版本 int,
父物料数量 int,
子物料数量 decimal(15,2)
,lev int)
as
begin
declare @i int,@j decimal(15,2)
set @i=1
insert @ta select *,@i from ta where 父物料编号=@父物料编号 and 父物料版本=@父物料版本
while @@rowcount>0
begin
set @i=@i+1
insert @ta select ta.*,@i from ta join @ta a
where ta.父物料编号=a.子物料编号 and ta.父物料版本=a.子物料版本 and lev=@i-1
end
return
end
--测试:
select * from dbo.test_f('A',1)--楼主求合计就行了父物料编号 父物料版本 子物料编号 子物料版本 父物料数量 子物料数量 lev
----- ----------- ----- ----------- ----------- --------------------------------------- -----------
A 1 B 1 1 2.00 1
A 1 C 1 1 1.00 1
B 1 Z 1 1 2.50 2
B 1 M 1 1 3.20 2
C 1 M 1 1 1.90 2
C 1 Z 1 1 3.50 2(6 行受影响)
select * from dbo.test_f('b',1)--楼主求合计就行了父物料编号 父物料版本 子物料编号 子物料版本 父物料数量 子物料数量 lev
----- ----------- ----- ----------- ----------- --------------------------------------- -----------
B 1 Z 1 1 2.50 1
B 1 M 1 1 3.20 1(2 行受影响)
from dbo.test_f('b',1) group by 子物料编号
--楼主求合计就行了子物料编号 父物料版本 子物料数量
----- ----------- ---------------------------------------
M 1 3.20
Z 1 2.50(2 行受影响)
---------------------------------------------------------------
--生成测试数据
create table BOM(ID INT,PID INT,NUM INT)
insert into BOM select 1,0,1
insert into BOM select 2,1,2
insert into BOM select 3,1,3
insert into BOM select 4,2,2
insert into BOM select 5,3,1
insert into BOM select 6,5,2
insert into BOM select 7,6,1
go--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),NUM INT,Level INT)
as
begin
declare @i int,@ret varchar(8000)
set @i = 1
insert into @t select ID,PID,NUM,@i from BOM where PID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t
select
a.ID,a.PID,a.NUM*B.NUM,@i
from
BOM a,@t b
where
a.PID=b.ID and b.Level = @i-1
end
delete t from @t t where exists(select 1 from @t where PID=t.ID)
return
end
go--执行查询
select ID,NUM from dbo.f_getChild(1)
go--输出结果
/*
ID NUM
---------- -----------
4 4
7 6
*/--删除测试数据
drop function f_getChild
drop table BOM