日期:2014-05-18  浏览次数:20459 次

有点难度的报表查询的存储过程
有这样一个需求:查询客户明细及其期末余额和日均余额。
表样如下:
日期:××年×月(下拉列表)                   机构:(可以选择总行或各行)
     
帐号   户名   客户号   控制额度   开户日   签约日     期末余额   本年日均   总日均

上面是一个报表的表样。要求:月度报表,次月1日起可查询本月月报,通过选择年份和月份查询历史月报。可通过机构选择,筛选为总行或分行报表。总行操作员可查询总分行全部报表,分行操作员可查询本分行报表。
字段说明:
控制额度:该客户设定的协定存款最低留存额
本年日均:从本年年初至报告日的日均余额。需要合计数
总日均:从开户日至报告日的日均余额。需要合计数

这张报表要求能反映历史情况的,比如一个客户在本月的状态值发生变化,在查询上个月的情况时,要展示出没有发生变化的情况.一个客户在不同的时间段内有不同的控制额度,有不同的状态值.期末余额也在发生变化.

请问这个存储过程应该怎么写,有点难度啊,给点具体的指点谢谢.(请仔细琢磨下要求)




------解决方案--------------------
给你几个求结余的例自己看.

数据库记录:
ID NumNo 要求出的结果
1 20 20
2 -8 12
3 -3 9
4 11 20
5 -4 16


求SQL语句实现;;;
敬请高手献招呀···


declare @t table(ID int,NumNo int)
insert into @t select 1,20
insert into @t select 2,-8
insert into @t select 3,-3
insert into @t select 4,11
insert into @t select 5,-4

select ID,NumNo,(select sum(NumNo) from @t where ID <=a.ID) as 要求出的结果 from @t a


ID NumNo 要求出的结果
----------- ----------- -----------
1 20 20
2 -8 12
3 -3 9
4 11 20
5 -4 16

(所影响的行数为 5 行)


借贷同时计算的问题

有一表如下
科目 方向 借方 贷方 余额
1001 0 0 0 3500(是现成数据)第一行
1001 0 500 0 0
1001 0 300 0 0
1001 0 0 1000 0
2101 1 0 0 1000(是现成数据)第一行
2101 1 0 300 0
2101 1 0 400 0
2101 1 600 0 0
2101 1 50 0 0
.....
现在想得到如下结果:
科目 方向 借方 贷方 余额
1001 0 0 0 3500(是现成数据)第一行
1001 0 500 0 4000(4000要通过计算的)第二行
1001 0 300 0 4300
1001 0 0 1000 3300
2101 1 0 0 1000(是现成数据)第一行
2101 1 0 300 1300
2101 1 0 400 1700
2101 1 600 0 1100
2101 1 50 0 950
.......
这里边的余额就第一条是现成数据
下面的都是要经过计算得出来的,公式如下

if(方向==0) 某一行的余额=上一行余额+第二行借方-第二行货方
if(方向==1) 某一行的余额=上一行余额-第二行借方+第二行货方
不要用游标,游标太慢


create table test(科目 varchar(8),方向 int,借方 int,贷方 int,余额 int)
insert into test select '1001 ',0,0 ,0 ,3500
insert into test select '1001 ',0,500,0 ,0
insert into test select '1001 ',0,300,0 ,0
insert into test select '1001 ',0,0 ,1000,0
insert into test select '2101 ',1,0 ,0 ,1000
insert into test select '2101 ',1,0 ,300 ,0
insert into test select '2101 ',1,0 ,400 ,0
insert into test select '2101 ',1,600,0 ,0
insert into test select '2101 ',1,50 ,0 ,0
go


alter table test add id int identity(1,1)
go

update t
set
余额=(select sum(余额+(case 方向 when 0 then 1 else -1 end)*(借方-贷方)) from test where 科目=t.科目 and id <=t.id)
from
test t
go

alter table test drop column id
go

select * from test
go

/*
科目 方向 借方 贷方