有一张表,怎么样按照时间分 周、旬、月、半月、季度、半年、年统计数据。
特别是按 旬、半月、季度之类的请高手给解释一下。还有,可不可以在oracle里建个job 按时到月的话把上一个月的数据自动插入到 月统计表。
或者分别按周、季度的把统计的数据插入到周、季度表中去。一定给分、万分感谢!!!

解决方案 »

  1.   

    周:select to_char(col_date,'yyyy ww'),sum(colname) from tbname group by to_char(col_date,'yyyy ww');
    旬:select to_char(col_date,'yyyy mm ')||trunc(to_char(coldate-1,'dd')/10) from tbname group by to_char(col_date,'yyyy mm ')||trunc(to_char(coldate-1,'dd')/10);
    月:select to_char(col_date,'yyyy mm'),sum(colname) from tbname group by to_char(col_date,'yyyy mm');
    半月:select to_char(col_date,'yyyy mm ')||decode(sign(to_char(coldate,'dd')-15),1,1,0),sum(colname) from tbname group by to_char(col_date,'yyyy mm ')||decode(sign(to_char(coldate,'dd')-15),1,1,0);
    季度:select to_char(col_date,'yyyy q'),sum(colname) from tbname group by to_char(col_date,'yyyy q');
    半年:select to_char(col_date,'yyyy ')||trunc((to_char(coldate,'mm')-1)/6) from tbname group by to_char(col_date,'yyyy ')||trunc((to_char(coldate,'mm')-1)/6);
    年:select to_char(col_date,'yyyy' from tbname group by to_char(col_date,'yyyy');
      

  2.   

    还有,可不可以在oracle里建个job 按时到月的话把上一个月的数据自动插入到 月统计表。
    或者分别按周、季度的把统计的数据插入到周、季度表中去。
    --------------------------------------------------------------------------------
    可以,没什么问题。
      

  3.   

    楼上的好厉害哦,学习学习。能不能写个job 的例子那。感谢哦。回头我给你送200分
      

  4.   

    DBMS_JOB.SUBMIT(:jobno,//job号
                    'your_procedure;',//要执行的过程
                    trunc(sysdate)+1/24,//下次执行时间
                    'trunc(sysdate)+1/24+1'//每次间隔时间
                   );
    删除job:dbms_job.remove(jobno);
    修改要执行的操作:job:dbms_job.what(jobno,what);
    修改下次执行时间:dbms_job.next_date(job,next_date);
    修改间隔时间:dbms_job.interval(job,interval);
    停止job:dbms.broken(job,broken,nextdate);
    启动job:dbms_job.run(jobno);
    例子:
    VARIABLE jobno number;
    begin
          DBMS_JOB.SUBMIT(:jobno, 
                  'insert into tb_month select trunc(col_date,''mm''),sum(colname) from tbname group by trunc(col_date,''mm'');', 
                   SYSDATE, 'SYSDATE + 1/720');
             commit;
    end;
    /
      

  5.   

    或者把操作都写在存储过程里面
    for example:create or replace procedure p_demo as
    begin
    insert into tb_1 
    select to_char(col_date,'yyyy ')||trunc((to_char(coldate,'mm')-1)/6) from tbname group by to_char(col_date,'yyyy ')||trunc((to_char(coldate,'mm')-1)/6);
    commit;
    end p_demo;
    /
    VARIABLE jobno number;
    begin
          DBMS_JOB.SUBMIT(:jobno, 
                  'p_demo;', 
                   SYSDATE, 'SYSDATE + 1');
             commit;
    end;
    /
      

  6.   

    非常感谢bzszp(SongZip),我在按旬统计数据时,怎么会出现下面的情况那。能把按旬统计给解释一下吗?
    2005 01 2             40
    2005 01 3             19
    2005 02 0             102  --- 二月分怎么会出现4 个统计数据呢?
    2005 02 1             7
    2005 02 2             106
    2005 02 3             21
    2005 03 0             48  -0、3分别代表的旬吗?如果所代表的1 没有数据,能否让它显示0呢?
    2005 03 2             32
      

  7.   

    sorry:
    try:
    select to_char(col_date,'yyyy mm ')||decode(trunc((to_char(coldate,'dd')-1)/10),0,'shangxun',1,'zhongxun','xiaxun') from tbname to_char(col_date,'yyyy mm ')||decode(trunc((to_char(coldate,'dd')-1)/10),0,'shangxun',1,'zhongxun','xiaxun') ;
      

  8.   

    不好意思,bzszp(SongZip)你好,按上面的统计旬时依然不对,统计现在3月的数据,截至到9号确统计出下旬的数据了:
    2005 03 上旬    32
    2005 03 下旬    51