请问下,想用一个SQL实现按周分组功能.
给定一段时间,我想以开始时间(开始日期不管周几都可以)按周分组,例如给定09年2月3号到2月23号,那么就按3号到9号,10号到16号...这么分组统计
不知是否可以实现下面这样,统计值为零的也占一行周数   日期             统计值
1    02/03-02/09       0
2    02/10-02/16      100
3   ...
多谢

解决方案 »

  1.   

    Select Weeks 周数
    ,to_char(To_Date('2009-02-03', 'YYYY-MM-DD') + 7 * (Weeks - 1),'MM/DD')||'-'||to_char(To_Date('2009-02-03', 'YYYY-MM-DD') + 7 * Weeks-1 ,'MM/DD') 日期
    ,Sumresults 统计值
    From (Select Trunc((Hiredate - To_Date('2009-02-03', 'YYYY-MM-DD')) / 7) + 1 Weeks
    ,Sum(Empno) Sumresults
    From Scott.Emp
     Group By Trunc((Hiredate - To_Date('2009-02-03', 'YYYY-MM-DD')) / 7) + 1);
    以上sql在Scott用户下调试过。
    Hiredate换成你需要计算的日期字段,empno换成你需要计算的字段,from 子句换成你的表和查询条件。
      

  2.   

    参考:
    很急的问题 按周统计和按月统计的问题
    http://topic.csdn.net/t/20060223/15/4573067.html
      

  3.   

    SELECT   to_char(日期,'yyyymm') 年月,'第'||to_char(日期,'w')||'周'  周,
    COUNT(*)   统计值     
    FROM   tb   
    GROUP   BY   to_char(日期,'yyyymm'),to_char(日期,'w');  
      

  4.   

    这里还有一个参考例子:
    http://www.itpub.net/thread-588185-1-1.html
      

  5.   

    select distinct to_char(to_date('year-month-day hour:minute:second','yyyy-mm-dd'),'yyyy-ww') from xxx_tbl;
      

  6.   

    select ceil((createtime - :start_date) / 7) as "周数",to_char(:start_date + ceil((createtime - :start_date) / 7) - 1,'mm/dd')||'-'||to_char(:start_date + ceil((createtime - :start_date) / 7) + 6,'mm/dd') as "日期",count(*) as "统计值" from yourtable where createtime >= :start_date and createtime <= :end_date group by ceil((createtime - :start_date) / 7);
    看这个行不行,如果start_date参数类型不对,可用to_date函数转换一下
      

  7.   

    如果还要出现统计值为0的行的话就这样写:
    select a."周数",to_char(:start_date + a."周数" * 7 - 7,'mm/dd')||'-'||to_char(:start_date + a."周数" * 7 - 1,'mm/dd') as "日期",nvl("统计值",0) as "统计值" from
    (select rownum as "周数" from yourtable where rownum <= ceil((:end_date - :start_date) / 7)) a,
    (select ceil((createtime - :start_date) / 7) as "周数",count(*) as "统计值" from yourtable group by ceil((createtime - :start_date) / 7)) b
    where a."周数" = b."周数"(+);
    上面语句不够精确,时间界线可能还有问题,你可微调一下。
    另外如果你专门建一个周数表就不用从yourtable中选rownum了。