我想,在表A中,数据如:
A:
  j k l  
  oracle 迅 2010-11
  java 鲁迅 2010-11
  c 李刚 2010-10
我现想按月份统计书的数量,结果如下:
 月份 数量
  1 0
  2 0
  3 0
....
  10 1
  11 2
  12 0
  请问,这样SQL要怎样写?

解决方案 »

  1.   

    select to_char(l,'yy') as 月份,count(*) as 数量
    from A
    group by to_char(l,'yy')
      

  2.   

    --使用substr函数取出月份子字符串,再group by 
    select substr(l,6,2) 月份,count(*) 数量 from a group by substr(l,6,2);
      

  3.   

    关键看你的l字段是何类型,如果是日期型,可按2楼的方法
    但应该是to_char(l,'mm'),如果是字符串则可以使用我的方法
      

  4.   

    SELECT b.l 月份, nvl(a.amount, 0) 数量
      FROM (SELECT substr(l, 6, 2) l, COUNT(*) amount FROM a GROUP BY substr(l, 6, 2)) a,
           (SELECT lpad(to_char(LEVEL), 2, '0') l FROM dual CONNECT BY LEVEL <= 12) b
     WHERE b.l = a.l(+)
     ORDER BY b.l;
      

  5.   


    create table test(j varchar2(10),k varchar2(10),l date);
    insert into test values('oracle','xun',to_date('2010-11','YYYY-MM'));
    insert into test values('java','luxun',to_date('2010-11','YYYY-MM'));
    insert into test values('c','xun',to_date('2010-11','YYYY-MM'))insert into test values('c','xun',sysdate);
    insert into test values('java','xun',sysdate);
    insert into test values('c++','xun',sysdate);SELECT b.l 月份, nvl(a.amount, 0) 数量
      FROM (select to_char(l, 'mm')  l, count(*)  amount
              from test
             group by to_char(l, 'mm')) a,
           (SELECT lpad(to_char(LEVEL), 2, '0') l
              FROM dual
            CONNECT BY LEVEL <= 12) b
     WHERE b.l = a.l(+)
     ORDER BY b.l;
    /*
    月份 数量
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    7 0
    8 0
    9 0
    10 0
    11 3
    12 0
    */