F_STATICDAYTIME F_DEADPOPNUM
2009-01-31 10
2009-02-28 14
2009-03-31 15
2009-04-30 19
2009-05-31 27
2009-06-30 31
2009-06-30 50

2009-07-31 33
2009-08-31 39
2009-09-30 45
2009-10-31 55
2009-11-30 69
2009-12-31 30
2009-12-31 31

2010-01-31 89
2010-02-28 99
2010-03-31 102
2010-04-30 108
2010-05-31 122
2010-06-30 126
2010-06-30 30

2010-07-31 148
2010-08-31 169
2010-09-30 170
2010-10-31 187
2010-11-30 196
2010-12-31 240
2010-12-31 205
数据如上所示,目的是要求2009年、2010年上半年和下半年的数据,用相减得方法求得,
比如2009年上半年的数据就是2009年6月30日的数据,如果有多个6月30日,就将多个6月30日相加,
2009年下半年的数据就是2009年12月31日的数据减去2009年6月30日的数据,如果有多个,则用12月31日数据的和减去6月30日数据的和(比如sum(12月31日数据)-sum(6月30日数据))按照上面的数据查询结果如下:
    时间          数据(F_DEADPOPNUM)
2009年上半年         81
2009年下半年         -20(计算方法:30+31-50-31)
2010年上班年         156
2010年下半年         289(计算方法:240+205-126-30)分数不多,求各位大虾多多帮忙,小弟在此谢谢了。

解决方案 »

  1.   

    SQL> select to_char(F_STATICDAYTIME,'yyyy')||'年上半年',
      2    sum(decode(to_char(F_STATICDAYTIME,'mmdd'),'0630',F_DEADPOPNUM,0))
      3   from tbl_sum t where to_char(F_STATICDAYTIME,'yyyy')in ('2009','2010')
      4   group by to_char(F_STATICDAYTIME,'yyyy')||'年上半年'
      5   union
      6  select to_char(F_STATICDAYTIME,'yyyy')||'年下半年',
      7    sum(decode(to_char(F_STATICDAYTIME,'mmdd'),'0630',-F_DEADPOPNUM,'1231',F_DEADPOPNUM,0))
      8   from tbl_sum t where to_char(F_STATICDAYTIME,'yyyy')in ('2009','2010')
      9   group by to_char(F_STATICDAYTIME,'yyyy')||'年下半年';
     
    TO_CHAR(F_STATICDAYTIME,'YYYY' SUM(DECODE(TO_CHAR(F_STATICDAY
    ------------------------------ ------------------------------
    2009年上半年                                               81
    2009年下半年                                              -20
    2010年上半年                                              156
    2010年下半年                                              289
     
    SQL> 
      

  2.   

    sum(decode(to_char(F_STATICDAYTIME,'mmdd'),'0630',-F_DEADPOPNUM,'1231',F_DEADPOPNUM,0)) 
    大虾,这句话我有点看不明白,你能解释一下吗?
    它的作用应该是用12月31日减去6月30日的数据,
    但是从decode的作用看,怎么达到这个目的的呢?
    小弟理解如下:如果等于0630,则等于 -F_DEADPOPNUM;
    如果等于1231,则等于F_DEADPOPNUM,否则等于0,
    但是怎么起到相减得作用呢?
      

  3.   

    哦,呵呵,明白了,它是把取得的所有符合条件的做了SUM,谢谢指点了,朋友。