Oracle中如何按入职日期统计2020年每月员工数 无入职月份显示0
解决方法
你现有查询的核心问题是仅基于员工表已有数据做分组,缺失无入职记录的月份,需要先构造2020年全年12个月的完整基准序列,再通过左关联统计数据,正确SQL如下:
SELECT COUNT(ed.empno) AS "Count", t.month_name AS Hiredate_Month FROM -- 生成2020年1-12月完整月份基准 ( SELECT TO_CHAR(ADD_MONTHS(DATE '2020-01-01', LEVEL - 1), 'mon', 'nls_date_language=english') AS month_name, LEVEL AS month_order FROM DUAL CONNECT BY LEVEL <= 12 ) t LEFT JOIN emp_details ed ON TO_CHAR(ed.hiredate, 'mon', 'nls_date_language=english') = t.month_name AND EXTRACT(YEAR FROM ed.hiredate) = 2020 GROUP BY t.month_name, t.month_order ORDER BY t.month_order;
逻辑说明
- 内层通过
CONNECT BY LEVEL <=12生成1-12的连续序列,基于2020年1月1日偏移生成全年12个月份,指定nls_date_language=english保证月份缩写为Jan/Feb这类英文格式,新增month_order字段保证后续排序正确。 - 采用左连接关联员工表,关联条件同时限定入职年份为2020,排除其他年份数据干扰。
- 统计时使用
COUNT(ed.empno)而非COUNT(*),左连接无匹配记录的月份会自动统计为0,符合需求。 - 最终按
month_order排序,输出顺序为1月到12月,和预期格式完全一致。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

