--有示例数据如下
create table ta(ParID nvarchar(10),ID nvarchar(10),Name nvarchar(10),Nums int)
insert into ta select '000' ,'A' ,'成品A' ,1
insert into ta select 'A' ,'B' ,'半成品B' ,20
insert into ta select 'A' ,'C' ,'原料C' ,20
insert into ta select 'A' ,'D' ,'半成品D' ,20
insert into ta select 'B' ,'I' ,'原料C' ,20
insert into ta select '000' ,'E' ,'成品A' ,1
insert into ta select 'E' ,'F' ,'半成品B' ,20
insert into ta select 'A' ,'G' ,'原料C' ,20
insert into ta select 'I' ,'H' ,'半成品D' ,20
insert into ta select 'H' ,'G' ,'原料C' ,20
go
/*--问题描述
tb表说明:
ParID --父ID
ID --
Name --
Nums --父含子的数量
Id为顶级时Parid为‘000’,Nums=1
name字段命名没有规律
要求求出每个顶级id的最明细项包含的数量,例如,在上面的数据中:
顶级ID为A,E,树形结构如下:
A
¦---B=20,累计20
¦---I=20,累计2020
¦---H=20,累计202020
¦---G=20,累计20202020
¦---C=20
¦---D=20
¦---G=20
E
¦---F=20
最终的结果:
A C 20
A D 20
A G (20202020)+20
E F 20
--/
--查询处理
select ParID,ID,Name,Nums
into #t from ta a
where exists(
select * from ta where ParID='000' and ID=a.ParID)
while @@rowcount>0
update a set Nums=a.Nums*b.Nums,ID=b.ID,Name=b.Name
from #t a,(
select ParID,ID,Name,Nums
from ta a
where exists(
select * from #t where ID=a.ParID)
)b where a.ID=b.ParID
select ParID,ID,Name,Nums=sum(Nums)
from #t
group by ParID,ID,Name
drop table #t
go
--删除测试
drop table ta
/*--测试结果
ParID ID Name Nums
---------- ---------- ---------- -----------
A C 原料C 20
A D 半成品D 20
A G 原料C 160020
E F 半成品B 20
(所影响的行数为 4 行)
--*/