假设有这样的记录
    时间        新增数量
2010-01-01          1
2010-01-02          3




2010-02-02          10


。需要查询出某一时间段内 一天的总量,也就是对这一天之前的所有新增数量求和。比如 查询 2010-01-03  到 2010-02-03 这一个月内每一天的保有量,会有30条记录。怎么写SQL

解决方案 »

  1.   

    不太明白 
    直接2010-01-03<= 时间 <=2010-02-03不就行了还是要这样的2010-01-01 1
    2010-01-02 3
    2010-01-03 0
    2010-01-04 0

    2010-02-02 10
      

  2.   

    累进求和?
    with tt as(
      select date'2010-01-03' 时间, 1 新增数量 from dual union all
      select date'2010-01-04' 时间, 3 新增数量 from dual union all
      select date'2010-01-05' 时间, 5 新增数量 from dual union all
      select date'2010-01-06' 时间, 8 新增数量 from dual)SELECT tt.*, SUM(新增数量) over(ORDER BY 时间) 累计和
      FROM tt
     WHERE tt.时间 BETWEEN DATE '2010-01-03' AND DATE '2010-02-03'
      

  3.   

    要是后一种要求select b.时间 
            ,nvl(a.新增数量,0)
    from(
    select 时间 新增数量
    from table
    where 2010-01-03<= 时间 
      and 时间 <=2010-02-03) A,
    (
    select to_date('2010-01-03')+(rownum-1) 时间
    from dual
    connect by rownum-1 <= to_date('2010-02-03') -  to_date('2010-01-03')
    ) B
    where b.时间 = a.时间(+)
    order by b.时间 asc
      

  4.   

    select m.dates,sum(t.num)
      from(select to_char(t.date,'yyyy-mm-dd') dates,t.num num
             from t
            where t.date between date_begin and date_end) m
     group by m.dates不知道说的是不是这个意思。
      

  5.   

    SQL> create table test_olap(dt date,amount number);
     
    Table createdinsert into test_olap(dt,amount) values(sysdate - 30,1);
    insert into test_olap(dt,amount) values(sysdate - 29,2);
    insert into test_olap(dt,amount) values(sysdate - 28,3);
    insert into test_olap(dt,amount) values(sysdate - 27,4);
    insert into test_olap(dt,amount) values(sysdate - 26,5);
    insert into test_olap(dt,amount) values(sysdate - 25,6);
    insert into test_olap(dt,amount) values(sysdate - 24,7);
    insert into test_olap(dt,amount) values(sysdate - 23,8);
    insert into test_olap(dt,amount) values(sysdate - 22,9);
    insert into test_olap(dt,amount) values(sysdate - 21,10);
    insert into test_olap(dt,amount) values(sysdate - 20,11);select to_char(dt,'yyyy-mm-dd') ,sum(amount) over(order by to_char(dt,'yyyy-mm-dd')) from test_olap;
    TO_CHAR(DT,'YYYY-MM-DD') SUM(AMOUNT)OVER(ORDERBYTO_CHAR
    ------------------------ ------------------------------
    2010-08-01                                            1
    2010-08-02                                            3
    2010-08-03                                            6
    2010-08-04                                           10
    2010-08-05                                           15
    2010-08-06                                           21
    2010-08-07                                           28
    2010-08-08                                           36
    2010-08-09                                           45
    2010-08-10                                           55
    2010-08-11                                           66
     
    11 rows selected
      

  6.   


    累计嘛
    不就是sum(累计字段) over(order by 排序字段)如果是不同月要重新从1号开始统计
    sum(累计字段) over(partition by 月份 order by 排序字段)
      

  7.   

    select date,money,sum(money) over( order by date desc) from test.tbstat;
      

  8.   

    select 时间,数量,sum(数量) over( order by 时间 desc) from test.tbstat;
      

  9.   

    不用over有什么好的办法,效率也高的 。 
      

  10.   

    还可以用自关联不过效率应该没over高
      

  11.   

    sum(新增数量) over(order by 时间)--或者select a.*,(select sum(新增数量) 新增数量 from tb b where a.时间<=b.时间) sum_xzsl
    from tb a
      

  12.   

    oracle法力无边呀............顶!!!!!!!!!!
      

  13.   

    把日期 按日截取,再分组统计吧select to_char(T.Date,'yyyy-mm-dd') Date,sum(T.Records)
    from T
    where T.Date between :date_begin and :date_end
    group by to_char(T.Date,'yyyy-mm-dd')