oracle表结构:
姓名 登记时间 登记人
张三 2011-12-23 王武
李四 2011-12-25 刘敏
周松 2011-11-24 王武
赵思 2011-10-22 王武
赵思 2011-10-01 王武
钱斯 2011-04-06 张松
周松 2011-03-24 王武
钱斯 2011-01-06 张松
要根据年份(如2011)和登记人查出每月登记的总人数
如:
1月份 1(个人)
2月份 0(个人)
3月份 1(个人)
.........
11月份 1(个人)
12月份 2(个人)
语句该怎么写啊???????
------解决方案--------------------------------------------------------
select rn
------解决方案--------------------------------------------------------
'月份' ,count(dat)
------解决方案--------------------------------------------------------
'(个人)' from
(select rownum rn from dual connect by rownum <=12) t1
,
(select substr(to_char(登记时间,'YYYYMMDD'),5,2) dat from a)t2
where t1.rn=t2.dat(+) group by rn order by rn
同一年的,登记时间是Date型
------解决方案--------------------------------------------------------
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(个人)