金额合计求值问题
发表于:2007-07-02来源:作者:点击数:
标签:
原帖地址: http://community.csdn.net/Expert/topic/3190/3190686.xml?temp=.6296961 表test中记录: aa bb 001 50.5 002 60 003 15.4 004 25 005 48 ... 输入任一金额,然后在表中查找是否有该金额或几条记录的合计等于该金额. 如:输入25,则要找出004,输入
原帖地址:
http://community.csdn.net/Expert/topic/3190/3190686.xml?temp=.6296961
表test中记录:
aa bb
001 50.5
002 60
003 15.4
004 25
005 48
...
输入任一金额,然后在表中查找是否有该金额或几条记录的合计等于该金额.
如:输入25,则要找出004,输入85,则要找出002与004,依次类推。
------------------------------------------------------------------------------------
--测试数据
create table test(aa varchar(10),bb numeric(10,2))
insert test select @#001@#,50.5
union all select @#002@#,60
union all select @#003@#,15.4
union all select @#004@#,25
union all select @#005@#,48
union all select @#006@#,37
go
--查询函数
create function fn_search(@Num numeric(10,2))
returns @r table (aa varchar(10),bb numeric(10,2))
as
begin
declare @t table (aa varchar(8000),aa1 varchar(10),bb numeric(10,2),level int)
declare @l int
insert @r select aa,bb from test where bb=@num
if @@rowcount>0 goto lb_exit
set @l=0
insert @t select @#,@#+aa+@#,@#,aa,bb,@l from test where bb<@num
while @@rowcount>0
begin
insert @r select distinct a.aa,a.bb
from test a,(
select a.aa,a.bb,aa1=b.aa from test a,@t b
where b.level=@l
and b.aa1<a.aa
and a.bb=@num-b.bb
)b where a.aa=b.aa or charindex(@#,@#+a.aa+@#,@#,b.aa1)>0
if @@rowcount>0 goto lb_exit
set @l=@l+1
insert @t select b.aa+a.aa+@#,@#,a.aa,a.bb+b.bb,@l
from test a,@t b
where b.level=@l-1
and b.aa1<a.aa
and a.bb<@num-b.bb
end
lb_exit:
return
end
go
--调用测试1
select * from dbo.fn_search(25)
/*--结果
aa bb
---------- ------------
004 25.00
(所影响的行数为 1 行)
--*/
--调用测试2
select * from dbo.fn_search(135.5)
/*--结果
aa bb
---------- ------------
001 50.50
002 60.00
004 25.00
005 48.00
006 37.00
(所影响的行数为 5 行)
--*/
--调用测试3(找不到的,无返回值)
select * from dbo.fn_search(135.7)
/*--结果
aa bb
---------- ------------
(所影响的行数为 0 行)
--*/
go
drop table test
drop function fn_search
原文转自:http://www.ltesting.net