天天看点

经典SQL之数据统计

有两表:表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