日期:2014-05-18 浏览次数:20731 次
ID Date Client NoPay YesPay 1 2012-02-01 张三 1000 0 2 2012-02-02 张三 0 500 3 2012-02-03 张三 800 0 4 2012-02-02 李四 600 0 5 2012-02-02 李四 0 500 6 2012-02-03 李四 0 100
ID Date Client NoPay YesPay Surplus 1 2012-02-01 张三 1000 0 1000 2 2012-02-02 张三 0 500 500 3 2012-02-03 张三 800 0 1300 4 2012-02-02 李四 600 0 600 5 2012-02-02 李四 0 500 100 6 2012-02-03 李四 0 100 0
--ID Date Client NoPay YesPay
--1 2012-02-01 张三 1000 0
--2 2012-02-02 张三 0 500
--3 2012-02-03 张三 800 0
--4 2012-02-02 李四 600 0
--5 2012-02-02 李四 0 500
--6 2012-02-03 李四 0 100
if OBJECT_ID('tb')is not null
drop table tb
go
create table tb (ID int,Date datetime,Client varchar(50), NoPay int,YesPay int)
insert into tb values(1 , '2012-02-01' , '张三' , 1000 , 0)
insert into tb values(2 , '2012-02-02' , '张三' , 0 , 500)
insert into tb values(3 , '2012-02-03' , '张三' , 800 , 0)
insert into tb values(4 , '2012-02-02' , '李四' , 600 , 0)
insert into tb values(5 , '2012-02-02' , '李四' , 0 , 500)
insert into tb values(6 , '2012-02-03' , '李四' , 0 , 100)
--ID Date Client NoPay YesPay Surplus
--1 2012-02-01 张三 1000 0 1000
--2 2012-02-02 张三 0 500 500
--3 2012-02-03 张三 800 0 1300
--4 2012-02-02 李四 600 0 600
--5 2012-02-02 李四 0 500 100
--6 2012-02-03 李四 0 100 0
;with ct as (
select *,(select SUM(NoPay-YesPay) from tb where ID=t.ID )s from tb t )
select c.ID,c.Date,c.Client,c.NoPay,c.YesPay,
(select SUM(s) from ct where Client=c.Client and Date<=c.Date and ID<=c.ID )Surplus from ct c
ID Date Client NoPay YesPay Surplus
----------- ----------------------- -------------------------------------------------- ----------- ----------- -----------
1 2012-02-01 00:00:00.000 张三 1000 0 1000
2 2012-02-02 00:00:00.000 张三 0 500 500
3 2012-02-03 00:00:00.000 张三 800 0 1300
4 2012-02-02 00:00:00.000 李四 600 0 600
5 2012-02-02 00:00:00.000 李四 0 500 100
6 2012-02-03 00:00:00.000 李四 0 100 0
(6 行受影响)
------解决方案--------------------
select id,date,client,nopay,yespay,
(select sum(s) from (select *,(nopay-yespay)s from tb) t where t.id<=a.id and t.client=a.client)
from (select *,(nopay-yespay)s from tb) a