create table test(
  value number(10),
  cur_date date  
)现在做想这样的查询,查询出某一天的累计值(从该月1号到当天sum(value))与上一月的同期累计值,条件 cur_date
例如:输入条件 20080808  查询出 20080801-20080808 累计值  20080701-20080708 累计值用一条语句查询出来,高手指点。。谢谢

解决方案 »

  1.   

    select To_char(cur_date,'yyyymm'),sum(value) from test 
    where (cur_date between 20080801 and 20080808) or (cur_date between 20080701 and 20080708 )
    Group by To_char(cur_date,'yyyymm')
    ;
      

  2.   


    把所有的20080808改成你查询的日期:SELECT TRUNC(CUR_DATE, 'mm'), SUM(VALUE)
      FROM TEST
     WHERE TRUNC(CUR_DATE) BETWEEN TRUNC(SYSDATE, 'mm') AND
           TO_DATE('20080808', 'yyyymmdd')
        OR TRUNC(CUR_DATE) BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'mm'), -1) AND
           ADD_MONTHS(TO_DATE('20080808', 'yyyymmdd'), -1)
     GROUP BY TRUNC(CUR_DATE, 'mm');
      

  3.   


    SQL> select * from tbl;     VALUE CUR_DATE
    ---------- ---------
            50 01-JUL-08
            10 05-JUL-08
            60 06-JUL-08
            40 11-JUL-08
            20 01-AUG-08
            10 05-AUG-08
            70 06-AUG-08
            30 11-AUG-088 rows selected.SQL> select sum(case when cur_date>=last_day(add_months(to_date('20080808','yyyymmdd'),-2))+1 and cur_date<=add_months(t
    o_date('20080808','yyyymmdd'),-1)
      2             then value else 0 end
      3  ) total1,
      4  sum(case when cur_date>=last_day(add_months(to_date('20080808','yyyymmdd'),-1))+1 and cur_date<=to_date('20080808',
    'yyyymmdd')
      5             then value else 0 end
      6  ) total2
      7  from tbl;    TOTAL1     TOTAL2
    ---------- ----------
           120        100SQL>
      

  4.   

    SELECT TRUNC(CUR_DATE, 'mm'), SUM(VALUE)
      FROM TEST1
     WHERE TRUNC(CUR_DATE) BETWEEN TRUNC(SYSDATE, 'mm') AND
           TO_DATE(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd')
        OR TRUNC(CUR_DATE) BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'mm'), -1) AND
           ADD_MONTHS(TO_DATE(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd'), -1)
     GROUP BY TRUNC(CUR_DATE, 'mm');
    这样子就不用输入参数了.就是计算到当天的
      

  5.   

    SELECT TRUNC(CUR_DATE, 'mm'), SUM(VALUE)
      FROM TEST1
     WHERE TRUNC(CUR_DATE) BETWEEN TRUNC(SYSDATE, 'mm') AND
           trunc(sysdate, 'dd')
        OR TRUNC(CUR_DATE) BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'mm'), -1) AND
           ADD_MONTHS(trunc(sysdate, 'dd'), -1)
     GROUP BY TRUNC(CUR_DATE, 'mm');刚刚查了下TRUNC用法,发现trunc(sysdate, 'dd')就表示当天的意思,这样子应该更简单些