欢迎光临
我们一直在努力

金额合计求值问题-数据库专栏,SQL Server

建站超值云服务器,限时71元/月

原帖地址:

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 金额合计求值问题-数据库专栏,SQL Server
分享到: 更多 (0)