金额合计求值问题

来源:互联网 发布:java object转换成map 编辑:程序博客网 时间:2024/05/03 20:27

原帖地址:

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    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   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



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=67518