有下面数据表:
期初数据表
年度 客户 期初
2013 A 1000
期间流入业务数据表
日期 客户 流入
2013-1-2 A 100
2013-1-4 A 200
2013-1-1 B 300
(其中B客户期初没有,是新增加的客户,有业务发生)
期间流出业务数据表
日期 客户 流出
2013-1-2 A 50
2013-1-3 A 100
假设今天是2013-1-5号,如果某个客户作为条件(假设条件是A),要求查询出昨天为止的历史流水帐
日期 客户 期初 流入 流出 本日结存
2013-1-1 A 1000 0 0 1000
2013-1-2 A 1000 100 50 1050
2013-1-3 A 1050 0 100 950
2013-1-4 A 950 200 0 1150
如果条件是B,则流水帐如下
日期 客户 期初 流入 流出 本日结存
2013-1-1 B 0 300 0 300
2013-1-2 B 300 0 0 300
2013-1-3 B 300 0 0 300
2013-1-4 B 300 0 0 300
这样的历史流水帐,能否查询得出来,用什么方法(只要得出正确的结果)比较合适。
谢谢
------解决方案--------------------
create table 期初数据表
(年度 varchar(6), 客户 varchar(5), 期初 int)
insert into 期初数据表
select '2013', 'A', 1000
create table 流入业务数据表
(日期 varchar(12), 客户 varchar(5), 流入 int)
insert into 流入业务数据表
select '2013-1-2', 'A', 100 union all
select '2013-1-4', 'A', 200 union all
select '2013-1-1', 'B', 300
create table 流出业务数据表
(日期 varchar(12), 客户 varchar(5), 流出 int)
insert into 流出业务数据表
select '2013-1-2', 'A', 50 union all
select '2013-1-3', 'A', 100
-- 建存储过程
create proc sp_getHistoryList
(@curDate varchar(12),
@customer varchar(5))
as
begin
with t as
(select a.日期,
@customer '客户',
isnull(b.流入,0) '流入',
isnull(c.流出,0) '流出'
from
(select convert(varchar,dateadd(d,number,cast(rtrim(year(@curDate))+'-1-1' as datetime)),23) '日期'
from master.dbo.spt_values
where type='P' and number<datediff(d,rtrim(year(@curDate))+'-1-1',@curDate)) a
left join
(select convert(varchar,cast(日期 as date),23) '日期',sum(流入) '流入'
from 流入业务数据表 where 客户=@customer
group by convert(varchar,cast(日期 as date),23)) b on a.日期=b.日期
left join
(select convert(varchar,cast(日期 as date),23) '日期',sum(流出) '流出'
from 流出业务数据表 where 客户=@customer
group by convert(varchar,cast(日期 as date),23)) c on a.日期=c.日期),
u as
(select a.日期,a.客户,
isnull((select c.期初 from 期初数据表 c
where c.年度=rtrim(year(@curDate)) and c.客户=a.客户),0)
+isnull((select sum(b.流入)-sum(b.流出) from t b
where b.日期<a.日期),0) '期初',
a.流入,a.流出
from t a)
select 日期,客户,期初,流入,流出,期初+流入-流出 '本日结存'
from u
end
-- 测试1
exec sp_getHistoryList @curDate='2013-1-5',@customer='A';
/*
日期 客户 期初 流入 流出 本日结存