首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

较复杂的数据统计!该怎么处理

2012-01-01 
较复杂的数据统计!!!表结构:父物料编号父物料版本子物料编号子物料版本父物料数量子物料数量A1B112A1C111B

较复杂的数据统计!!!
表结构:
父物料编号   父物料版本   子物料编号     子物料版本   父物料数量       子物料数量            
  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的数量!
能否快速的计算出来啊!

[解决办法]
http://community.csdn.net/Expert/topic/5429/5429535.xml?temp=.7268946
[解决办法]
create table ta(
父物料编号 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.9

create 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 行受影响)


[解决办法]
一个简单的递归取叶子节点及计算数量的例子:
---------------------------
--生成测试数据
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

热点排行