遞迴用函式、儲存過程實現的效果
--測試
create table ta ( 專案 varchar ( 20), 上級專案 varchar ( 20), num int )
insert ta
select 'A' , '' , 100 union all
select 'B' , 'A' , 200 union all
select 'C' , 'B' , 300 union all
select 'D' , 'B' , 400 union all
select 'E' , 'C' , 500 union all
select
'F'
,
'D'
,
600 union all
select 'H' , 'E' , 700 union all
select 'G' , 'F' , 800
-- 如果要顯示上級的專案 :
create function roy_f( @ 專案 varchar ( 20))
returns varchar ( 100)
as
begin
declare @ 上級專案 varchar ( 20)
select @ 上級專案 = 上級專案 from ta where 專案 = @ 專案
return
case
when
@
上級專案
is
null
then
null
else isnull ( dbo. roy_f( @ 上級專案 )+ '-' , '' )+ @ 專案 end
end
-- 如果顯示各級專案的彙總金額 :
create function roy_f2( @ 專案 varchar ( 20))
returns int
as
begin
declare @tb table ( 專案 varchar ( 20), 上級專案 varchar ( 20), num int , lev int )
declare @i int , @sum int
set @i= 0
insert @tb select *, @i from ta where 專案 = @ 專案
while @@rowcount > 0
begin
set @i= @i+ 1
insert @tb
select a.*, @i
from ta a, @tb b
where b. 專案 = a. 上級專案 and b. lev= @i- 1
end
select @sum= sum ( num) from @tb
return @sum
end
-- 測試 :
select 專案 , 金額 = dbo. roy_f2( 專案 ), 關係 = dbo. roy_f( 專案 ) from ta
/*
專案 金額 關係
-------------------- ----------- ---------------
A 3600 A
B 3500 A-B
C 1500 A-B-C
D 1800 A-B-D
E 1200 A-B-C-E
F 1400 A-B-D-F
H 700 A-B-C-E-H
G 800 A-B-D-F-G
(所影響的行數為 8 行)
*/
-- 用儲存過程統計 :
create proc roy_p @ 專案 varchar ( 20)
as
begin
declare @i int
set @i= 0
select *, 級數 = @i into #
from ta where 專案 = @ 專案
while @@rowcount > 0
begin
set @i= @i+ 1
insert #
select ta.*, 級數 = @i
from ta, # b
where ta. 上級專案 = b. 專案
and b. 級數 = @i- 1
end
select [sum]= sum ( num) from #
end
-- 測試 :
exec roy_p 'A'
/*
sum
-----------
3600
(所影響的行數為 1 行)
*/
-- 刪除測試 :
drop function roy_f, roy_f2
drop proc roy_p
drop table ta