有两表:表v记录各id进出的数量(进为正,出为负),表b记录各id的余数。
表v 表b
id rq 进出数 ctc id rq 余数 ctc
1 2004-05-10 100 11 1 2004-05-10 100 11
1 2004-05-15 -20 11 1 2004-05-15 80 11
2 2004-05-10 200 11 2 2004-05-10 200 11
2 2004-05-12 50 11 2 2004-05-12 250 11
2 2004-06-02 -100 11 2 2004-06-02 150 11
3 2004-05-12 50 13 3 2004-05-12 50 13
3 2004-05-20 -10 13 3 2004-05-20 40 13
现在想统计某一时间段rq1至rq2内不同点ctc各天的进数、出数、余数
比如要得到2004-05-10至2004-05-20之间每一ctc各天的变化结果,如下:
ctc rq 进 出 余数
(进出数正值之和) (进出数负值之和) (id对应b表最大日期的余数之和)
11 2004-05-10 300 0 300
11 2004-05-12 50 0 350
11 2004-05-15 0 20 330
13 2004-05-12 50 0 50
13 2004-05-20 0 10 40
答案(csdn邹建做答)
--查询参数定义
declare @dt1 datetime,@dt2 datetime
select @dt1='2004-05-12',@dt2='2004-05-20'
--查询语句
select ctc,rq=convert(char(10),rq,120)
,进=sum(case when 进出数>0 then 进出数 else 0 end)
,出=-sum(case when 进出数<0 then 进出数 else 0 end)
,余数=(
select sum(余数)
from b join(
select id,rq=max(rq) from b
where ctc=v1.ctc and rq <=v1.rq
and exists(
select 1 from v
where ctc=v1.ctc and id=b.id
and rq <=v1.rq)
group by id
)a on a.id=b.id and a.rq=b.rq)
from v v1
where rq between @dt1 and @dt2
group by ctc,rq
order by ctc,rq