假设表temp
name   workdate   val
a      20060301    3
b      20060420    6
c      20060103    2
a      20060508    1
d      20060201    9
.......其中workdate是字符型表示的日期,val为数值,现在想求一sql语句实现如下结果:name   month    sumval(合计值)
a      200601     ?
a      200602     ?
a      200603     ?
b      200601     ?
....
即按name和月份分组求出val的合计值,但这个合计值的要求是如果月份是200602,那么求出200602月之前所有val的合计值,而不仅是2月份的合计值。

解决方案 »

  1.   

    select name, substr(month,1,6) month, sum(val) sumval from temp
    where .....
    group by name, substr(month,1,6);我没试,建表麻烦,不过八九不离十了
      

  2.   

    select name,
           substr(workdate,1,6) month,
           SUM (val) OVER (PARTITION BY name ORDER BY substr(workdate,1,6)  RANGE UNBOUNDED PRECEDING) sumval
      from temp
      

  3.   

    刚才的有点问题,再来
    select name,
           month,
           SUM (sval) OVER (PARTITION BY name ORDER BY month RANGE UNBOUNDED PRECEDING) sumval
      from 
          (select name,substr(workdate,1,6) month, sum(val) sval 
             from sumval 
         group by name,substr(workdate,1,6))
      

  4.   

    select name,substr(workdate,0,6),sum(val) 
    from temp group by name,substr(workdate,0,6)
      

  5.   

    楼上的楼上你的语句只能在oracle9或以上版本才可有
      

  6.   

    SQL> select *from temp;NAM WORKDATE               VAL
    --- --------------- ----------
    a   20060301                 3
    b   20060420                 6
    c   20060103                 2
    a   20060508                 1
    d   20060201                 9
    b   20060120                 8
    b   20060220                 2
    b   20060320                 5SQL> select name , substr(workdate,1,6) as month,
      2  sum(val) over(partition by name order by workdate
      3  rows between unbounded preceding and 0 following) as sumval
      4  from temp ;NAM MONTH            SUMVAL
    --- ------------ ----------
    a   200603                3
    a   200605                4
    b   200601                8
    b   200602               10
    b   200603               15
    b   200604               21
    c   200601                2
    d   200602                9已选择8行。
      

  7.   

    谢谢czbbbs(强弩)和xiaoxiao1984(笨猫一只^_^) 两位老大,这个问题已解决,再问一个更有难度的问题,如果我想要的结果中是这样的,比如b在200602月份中没有数据那么在2月份的统计中就不存在b的用户,但我还要2月份中有b,其合计值仍为2月份之前所有数据之和,不知如何实现?请再帮忙考虑一下,帖子分数不够我再加。