• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
鱼要的是海洋,鸟要的是天空,我要的是自由!
平凡的人不平凡的人生
博客园    首页    新随笔    联系   管理    订阅  订阅

金额合计求值问题

原帖地址:

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

posted @ 2007-06-29 16:30  伊凡  阅读(276)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3