存储过程中给定年份,统计出任务表中每月有多少条数据
任务表A:
XM     DJSJ          DJDW
张三   2011-12-02    公司1
张四   2011-12-02    公司2
张无   2011-11-02    公司1
张刘   2011-10-02    公司1
...........查询出的结果要是这样的:
月份     总数
1月份     0
2月份     3
3月份     0
4月份     1
5月份     3
6月份     5
7月份     0
8月份     3
9月份     0
10月份     0
11月份     1
12月份     3
没有数量 则显示为0
这个存储过程的语句要怎么写啊????

解决方案 »

  1.   

    同一年的数据处理 DJSJ是date型,不是date型就转换一下
    select t1.rn||'月份' Mydate,count(A.DJSJ) Mycount from 
    (select rownum rn from dual connect by rownum<=12) t1  left join  A
    on t1.rn=to_char(A.DJSJ,'MM') group by Mydate order by Mydate
      

  2.   

    没有必要使用存储过程,一个SQL语句就搞定了。
    当然使用存储过程来解决就更简单了。可以参考下面的例子,将sum改成count就可以了。CREATE TABLE T79
    (
        MyDate DATE,
        MyNum  NUMBER(4)
    );-- 无效数据
    INSERT INTO T79 VALUES(to_date('2010-01-01', 'YYYY-MM-DD'), 1);
    INSERT INTO T79 VALUES(to_date('2012-11-01', 'YYYY-MM-DD'), 11);
    -- 有效数据
    INSERT INTO T79 VALUES(to_date('2011-01-01', 'YYYY-MM-DD'), 1);
    INSERT INTO T79 VALUES(to_date('2011-01-03', 'YYYY-MM-DD'), 3);
    INSERT INTO T79 VALUES(to_date('2011-02-01', 'YYYY-MM-DD'), 2);
    INSERT INTO T79 VALUES(to_date('2011-02-04', 'YYYY-MM-DD'), 4);SELECT to_char(m, 'YYYY-MM') 月份, SUM(MyNum) 总数
    FROM
    (SELECT TRUNC(MyDate, 'MONTH') m, MyNum
    FROM T79
    WHERE MyDate BETWEEN to_date('2011-01-01', 'YYYY-MM-DD')
          AND to_date('2011-12-31', 'YYYY-MM-DD')
    )
    GROUP BY m
    ORDER BY m;  
      

  3.   


    WITH T1 AS(
        SELECT ADD_MONTHS(DATE'2010-12-01',LEVEL) AS t_date
        FROM DUAL CONNECT BY LEVEL <= 12
      ),T2 AS(SELECT '张三' 姓名,date'2011-12-23' 时间 , '王武' 登记人 FROM DUAL UNION ALL
              SELECT '李四' 姓名,date'2011-12-25' 时间 , '刘敏' 登记人 FROM DUAL UNION ALL
              SELECT '周松' 姓名,date'2011-11-24' 时间 , '王武' 登记人 FROM DUAL UNION ALL
              SELECT '赵思' 姓名,date'2011-10-22' 时间 , '王武' 登记人 FROM DUAL UNION ALL
              SELECT '赵思' 姓名,date'2011-10-01' 时间 , '王武' 登记人 FROM DUAL UNION ALL
              SELECT '钱斯' 姓名,date'2011-04-06' 时间 , '张松' 登记人 FROM DUAL UNION ALL
              SELECT '周松' 姓名,date'2011-03-24' 时间 , '王武' 登记人 FROM DUAL UNION ALL
              SELECT '钱斯' 姓名,date'2011-01-06' 时间 , '张松' 登记人 FROM DUAL
      )SELECT TO_CHAR(T1.t_date,'YYYY-MM') 月份,NVL(count(T2.时间),0)||'(个人)' 总人数
         FROM T1 LEFT JOIN T2 ON TO_CHAR(T1.t_date,'YYYY-MM') = TO_CHAR(T2.时间,'YYYY-MM')
        GROUP BY TO_CHAR(T1.t_date,'YYYY-MM')
        ORDER BY TO_CHAR(T1.t_date,'YYYY-MM')-------------------------------------------------------------------------------------
           月份    总人数
    1     2011-01    1(个人)
    2     2011-02    0(个人)
    3     2011-03    1(个人)
    4     2011-04    1(个人)
    5     2011-05    0(个人)
    6     2011-06    0(个人)
    7     2011-07    0(个人)
    8     2011-08    0(个人)
    9     2011-09    0(个人)
    10    2011-10    2(个人)
    11    2011-11    1(个人)
    12    2011-12    2(个人)
      

  4.   

    我是页面传递值到oracle中进行查询的,页面上有三个button,分别是每周,每月,每年,根据不同的值,怎么用同一句话来查询???
      

  5.   

    那可以分别调用3个sql来完成查询 
    每周 每月 每年 不是一个概念  不可能用一个sql完成 除非传值1、2、3代表3种类型 然后case when来完成3个sql