当前位置: 代码迷 >> Sql Server >> 查询每天流水记录的SQL语句
  详细解决方案

查询每天流水记录的SQL语句

热度:79   发布时间:2016-04-24 11:00:00.0
求一个查询每天流水记录的SQL语句
有下面数据表:

期初数据表
年度    客户    期初
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';

/*
日期                             客户    期初          流入          流出          本日结存
  相关解决方案