存储过程中给定年份,统计出任务表中每月有多少条数据
任务表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
这个存储过程的语句要怎么写啊????
任务表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
这个存储过程的语句要怎么写啊????
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
当然使用存储过程来解决就更简单了。可以参考下面的例子,将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;
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(个人)
每周 每月 每年 不是一个概念 不可能用一个sql完成 除非传值1、2、3代表3种类型 然后case when来完成3个sql