有一表,内容主要有客户消费情况,如:客户名,消费起始日期,消费终止日期,消费总金额,日均消费额
A    , 2005-09-02  , 2005-09-11, 90       , 10
B    , 2005-09-05  , 2005-09-10, 100      , 20
C    , 2005-09-11  , 2005-09-18, 140      , 20
D    , 2005-09-08  , 2005-09-13, 200      , 40
.......最后要计算出
日期                  收入
2005-09-02            10=(A)
2005-09-03            10=(A)
2005-09-04            10=(A)
2005-09-05            30=(A+B)
2005-09-06            30=(A+B)
2005-09-07            30=(A+B)
2005-09-08            70=(A+B+D)
2005-09-09            70=(A+B+D)
2005-09-10            .......
......在数据量较大的情况下,用什么样的方法进行计算比较科学有较.用的oracle数据库

解决方案 »

  1.   

    建一个表tj(从2005-01-01到2005-12-31,一天是一条记录),你用游标取你那个表的数据,更新tj表中的值,(update tj set 收入=收入+日消费 where 日期>=消费起始日期 and 日期<=消费终止日期)
    你最好能把你的数据发给我,我可以试一下!,QQ:26491405,大家可以讨论一下!
      

  2.   

    1.select min(消费起始日期),max(消费终止日期) FROM table1  
      统计的起始日期和终止日期
    2.insert into table2 values (统计日期,0)
      循环执行,统计日期从起始日期递增到终止日期,生成统计初始记录
    3.select sum(日均消费额) from table1 where 统计日期>=消费起始日期 and 统计日期<=消费终止日期
       
    遍历统计表,将每次的SUM结果写入收入字段。
      

  3.   

    其实都没有一个好方法;但我已得到一个解决方法,还是谢谢大家。
    其实一条SQL语句就解决了,还很快,楼上的也不是没有解决,但没有效率,看看下面的,大家也学习一下。SQL> select * from b;客户名     消费起始日期 消费终止日期 消费金额   日均消费额
    ---------- ------------ ------------ ---------- ----------
    A          2005-9-2     2005-9-11    90                 10
    B          2005-9-5     2005-9-10    100                20
    C          2005-9-11    2005-9-18    140                20
    D          2005-9-8     2005-9-13    200                40Executed in 0.015 secondsSQL> select i "日期",(select sum((case when b4 <= i and i <=b5 then b3 else 0 end )) from b) as "收入"
    from 
    (select d+r-1 i,d,m from 
    (select min(b4) d,max(b5) m from b),
    (select rownum r from test where rownum <= (select max(b5)-min(b4)+1 from b))
    ) k
    left join b on k.i=b4
    order by i日期              收入
    ----------- ----------
    2005-9-2            10
    2005-9-3            10
    2005-9-4            10
    2005-9-5            30
    2005-9-6            30
    2005-9-7            30
    2005-9-8            70
    2005-9-9            70
    2005-9-10           70
    2005-9-11           70
    2005-9-12           60
    2005-9-13           60
    2005-9-14           20
    2005-9-15           20
    2005-9-16           20
    2005-9-17           20
    2005-9-18           2017 rows selectedExecuted in 0.046 seconds