表A:
ID   DATE       MONEY
-------------------
01   20061201   100
01   20070101   200
01   20070201   300
02   20061201   400
02   20070101   500
02   20070201   600怎么用一个SQL实现如下的结果
结果:
ID   MONTHS(2006/12后的月数) MONEY
--------------------------------------
01   01                      100
01   02                      200+100=300
01   03                      300+200+100=600
02   01                      400
02   02                      500+400=900
02   03                      600+500+400=1500目前就想到用程序递归实现。
能用一个SQL语句实现吗?

解决方案 »

  1.   

    可以啊
    select id,Months_between(month, to_date('20061201','yyyyMMdd')) as MONTHS, sum(money) over (partition by id order by id, month ) as money from adate是oracle的类型,不能作为字段
    如果month作为varchar2类型,则用to_date转换一下
      

  2.   

    谢谢manyroads兄。
    可能我的要求没有写清楚,我求合计是要日期比较的,比如ID01,DATE20070101需要把01的小于20070101的money合计起来。
    用partition by 好像不行。
    我想到了自联结,好像可以实现。
    所以只能给一半的分了。
      

  3.   

    select id,to_char(to_date('20061201','yyyyMMdd'),'mm') mm,sum(money) from a
    group by to_char(to_date('20061201','yyyyMMdd'),'mm')  试试看
      

  4.   

    忘记说了 to_char(to_date('20061201','yyyyMMdd'),'mm') 把数字换成字段名称date
      

  5.   

    楼主的意思是:
    select a.ID,
     case a.ID=b.ID and a.DATE=b.DATE then
       sum(a.MONEY)
     case a.ID=b.ID and a.DATE<>b.DATE then
       a.MONEY+ b.MONEY=sum(a.MONEY+ b.MONEY)
     .....
     end
    from a,b
    where
      a.ID=b.ID(+)
     and a.DATE>2006/12
    group by a.ID ....----------------
    如果是这样,可能要嵌套好几层;建议千万别用sql完成,到后台处理吧,否则搞死人的!只提建议,请别给我分,谢谢。
      

  6.   

    回答一下我的思路,不是递归的。
    1、就是先把数据分组排序成如下的数据:
    表A:
    ID   DATE       MONEY    序号
    -----------------------------
    01   20061201   100      1
    01   20070101   200      2
    01   20070201   300      3
    02   20061201   400      1
    02   20070101   500      2
    02   20070201   600      32、把1的数据进行2个表(a,b)自连结,
       1)判断ID相同 and 序号相同 :只取a.MONEY
       2)判断ID相同 and 序号数作为加数的个数,
           如2就2个数相加 :取1)+b.MONEY;
           如3就3个数相加:取1)+b.MONEY+..不过上面的想法实现的话比较麻烦的!
      

  7.   

    谢谢各位的关注和帮助。
    公布一下我的做法吧。
    SELECT 
      BB.ID,
      MONTHS_BETWEEN(BB.DATE,TO_DATE('20061201','YYYYMMDD')),
      SUM(AA.MONEY)
    FROM
      表A AA,表A BB
    WHERE
      AA.ID=BB.ID
      AND AA.DATE<=BB.DATE
    GROUP BY
      BB.ID,
      MONTHS_BETWEEN(BB.DATE,TO_DATE('20061201','YYYYMMDD'))