SQL笔试题-在职员工数量

Posted by 道行尚浅 on August 1, 2018

表结构与内容如下

员工名字 入职日期 合同签订年限
ename hiredate hire_years
SMITH 1980-12-17 2
ALLEN 1981-02-20 2
WARD 1981-02-22 1
JONES 1981-04-02 1
MARTIN 1981-09-28 3
BLAKE 1981-05-01 2
CLARK 1981-06-09 1
SCOTT 1987-04-19 2
KING 1981-11-17 1
TURNER 1981-09-08 1
ADAMS 1987-05-23 1
JAMES 1981-12-03 3
FORD 1981-12-03 1
MILLER 1982-01-23 2
  • 问题为: 打印每一天员工的数量

附:数据


create table DAO_EMPS
(
  ename      VARCHAR2(10),
  hiredate   DATE,
  hire_years NUMBER
)
;

insert into DAO_EMPS (ename, hiredate, hire_years)
values ('SMITH', to_date('17-12-1980', 'dd-mm-yyyy'), 2);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('ALLEN', to_date('20-02-1981', 'dd-mm-yyyy'), 2);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('WARD', to_date('22-02-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('JONES', to_date('02-04-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('MARTIN', to_date('28-09-1981', 'dd-mm-yyyy'), 3);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('BLAKE', to_date('01-05-1981', 'dd-mm-yyyy'), 2);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('CLARK', to_date('09-06-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('SCOTT', to_date('19-04-1987', 'dd-mm-yyyy'), 2);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('KING', to_date('17-11-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('TURNER', to_date('08-09-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('ADAMS', to_date('23-05-1987', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('JAMES', to_date('03-12-1981', 'dd-mm-yyyy'), 3);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('FORD', to_date('03-12-1981', 'dd-mm-yyyy'), 1);
insert into DAO_EMPS (ename, hiredate, hire_years)
values ('MILLER', to_date('23-01-1982', 'dd-mm-yyyy'), 2);
commit;


解答


select  to_char(everyday,'yyyy-mm-dd')  || ' | ' ||count(hiredate)
  from dao_emps right join 
       (select  (min_hire_date + level) everyday
          from dual,
               (select min(hiredate) min_hire_date,
                       max(add_months(hiredate, hire_years * 12)) -
                       min(hiredate) num_days
                  from dao_emps)
        connect by level <= num_days) nian_li
 on  everyday >= dao_emps.hiredate  and    everyday<=(add_months(hiredate, hire_years * 12)-1 )     
      group by everyday 
       order by everyday 

答案节选

 日期 | 人数
 ---| ---
1980-12-18 | 1
1981-02-20 | 2
1981-02-21 | 2
1981-02-22 | 3
1981-02-23 | 3
1981-04-02 | 4
1981-04-03 | 4
1981-05-01 | 5
1981-05-02 | 5
1981-06-11 | 6
1981-09-08 | 7
1981-09-28 | 8
1981-11-17 | 9
1981-12-03 | 11
1982-01-23 | 12
1982-02-22 | 11
1982-04-02 | 10
1982-06-09 | 9
1982-09-08 | 8
1982-11-17 | 7
1982-12-03 | 6
1982-12-18 | 5
1983-02-20 | 4
1983-05-01 | 3
1984-01-23 | 2
1984-10-17 | 1
1984-12-03 | 0
1987-04-19 | 1
1987-05-23 | 2
1988-05-23 | 1
1989-04-19 | 0