在 Oracle 中根据雇用日期查找员工人数

find the employee count based on hire date In Oracle

我想找出当年(2020 年)1 月到 12 月之间所有加入的员工人数。假设如果任何员工在任何特定月份没有加入,计数应显示为 0。

Empno Ename  Hiredate     deptno
101   ram    11-Jan-20    10
102   kumar  07-Mar-20    10
103   Raja   06-Oct-20    20
104   Sasi   16-Dec-20    20
105   manoj  19-Dec-20    10

Excepted Output

Count  Hiredate_Month
1      Jan
0      Feb
1      Mar
0      Apr
0      May
0      Jun
0      Jul
0      Aug
0      Sep
1      Oct
0      Nov
2      Dec

我试过下面的东西。

create table emp_details(empno number,ename varchar2(22),hiredate date,deptno number);

insert into emp_details values(101,'ram','11-jan-2020',10);
insert into emp_details values(102,'kumar','07-mar-2020',10);
insert into emp_details values(103,'raja','06-oct-2020',20);
insert into emp_details values(104,'sasi','16-dec-2020',20);
insert into emp_details values(105,'manoj','19-dec-2020',10);

select count(*),to_char(hiredate,'mon') from emp_details group by
to_char(hiredate,'mon')

以上查询未显示员工未加入的月份的计数 0。

在 Scott 的示例架构中,有 EMP table:

SQL> select ename, hiredate
  2  from emp
  3  order by to_char(hiredate, 'mm');

ENAME      HIREDATE
---------- --------
ADAMS      12.01.83   --> Adams and Miller
MILLER     23.01.82   --> were hired in January
ALLEN      20.02.81
WARD       22.02.81
                      --> nobody was hired in March
JONES      02.04.81   --> Jones was hired in April
BLAKE      01.05.81
CLARK      09.06.81
TURNER     08.09.81
MARTIN     28.09.81
KING       17.11.81
SCOTT      09.12.82
SMITH      17.12.80
JAMES      03.12.81
FORD       03.12.81

14 rows selected.

为了获得您想要的结果,您需要一个 日历 - 单独的 table 其中包含一年中的所有月份,因为 table 没有雇员'包含所有月份(见上文 - 例如三月份没有人被雇用)。

然后您将 日历原始 table 外部联接,计算员工人数,然后 - 就是这样:

SQL> with calendar as
  2    (select lpad(level, 2, '0') mon
  3     from dual
  4     connect by level <= 12
  5    )
  6  select to_char(to_date(c.mon, 'mm'), 'Mon', 'nls_date_language = english') hiredate_month,
  7    count(e.empno) cnt
  8  from calendar c left join emp e on to_char(e.hiredate, 'mm') = c.mon
  9  group by c.mon
 10  order by c.mon;

HIREDATE_MON        CNT
------------ ----------
Jan                   2
Feb                   2
Mar                   0
Apr                   1
May                   1
Jun                   1
Jul                   0
Aug                   0
Sep                   2
Oct                   0
Nov                   1
Dec                   4

12 rows selected.

SQL>