SQL查询Oracle查找员工第一份工作&平均薪水与公司和最后(或当前)工作&平均薪水与公司

时间:2016-11-01 23:28:14

标签: sql oracle oracle11g

我正在尝试返回

的列

员工ID 适用于所有员工,无论他们只有一份工作,还是     很多工作

第一个作业作业ID (job_history表中的第一个作业ID或者员工表中的第一个作业ID只有一个作业)

该工作的

平均工资

最近作业的作业ID (员工表中显示的作业)

该工作的

平均工资

员工当前工资

TABLES

HR.JOBS

Name       Null     Type         
---------- -------- ------------ 
JOB_ID     NOT NULL VARCHAR2(10) 
JOB_TITLE  NOT NULL VARCHAR2(35) 
MIN_SALARY          NUMBER(6)    
MAX_SALARY          NUMBER(6)

HR.EMPLOYEES

Name           Null     Type         
-------------- -------- ------------ 
EMPLOYEE_ID    NOT NULL NUMBER(6)    
FIRST_NAME              VARCHAR2(20) 
LAST_NAME      NOT NULL VARCHAR2(25) 
EMAIL          NOT NULL VARCHAR2(25) 
PHONE_NUMBER            VARCHAR2(20) 
HIRE_DATE      NOT NULL DATE         
JOB_ID         NOT NULL VARCHAR2(10) 
SALARY                  NUMBER(8,2)  
COMMISSION_PCT          NUMBER(2,2)  
MANAGER_ID              NUMBER(6)    
DEPARTMENT_ID           NUMBER(4)    
GENDER                  CHAR(1) 

HR.JOB_HISTORY

Name          Null     Type         
------------- -------- ------------ 
EMPLOYEE_ID   NOT NULL NUMBER(6)    
START_DATE    NOT NULL DATE         
END_DATE      NOT NULL DATE         
JOB_ID        NOT NULL VARCHAR2(10) 
DEPARTMENT_ID          NUMBER(4) 

这是我到目前为止的内容

    SELECT a.employee_id, a.job_id, a.current_avg_earnings, a.salary,
         NVL(to_char(a.previous_avg_earnings),'same') previous_avg_earnings
FROM
(SELECT e.employee_id, e.job_id, 
  (SELECT SUM(j.max_salary+j.min_salary)/2
FROM hr.jobs j
WHERE j.job_id = e.job_id) AS current_avg_earnings, salary,
  (SELECT SUM(j.max_salary+j.min_salary)/2
FROM hr.job_history h
JOIN hr.jobs j ON h.job_id = j.job_id
WHERE h.employee_id = e.employee_id AND h.job_id = e.job_id)
AS previous_avg_earnings
FROM hr.employees e
) a;

示例行

EMPLOYEE_ID FIRST_JOB_ID AVG_1 CURRENT_JOB_ID AVG_2 SALARY
----------- ------------ ----- -------------- ----- ------
0001        MAILCLERK    2400  SAME           SAME   2900
0002        MACHINETECH  4800  ENGINEER       9800   10500
0003        CASHIER      2300  SECRETARY      4500   5500
0004        MANAGER      9900  SAME           SAME   12500

1 个答案:

答案 0 :(得分:1)

在第一次CTE u中,从employee_id, salary, job_id表格中收集当前employees,从union all加入employee_id, (current) salary, first job_id employees job_history。稍后准备一个数据透视表,添加一列status以区分c来自f irst。然后在第二个CTE p中,将此联合的结果加入jobs表,以获得每个作业的平均值(“第一个”和“当前”)。然后转动以将“first”与“current”分开 - 并且,在select中,pivot将为“first”列创建NULL,使用nvl()来填充当前值。

with 
     u ( employee_id, salary, job_id, status ) as (
       select employee_id, salary, job_id, 'c'
         from employees
       union all
       select e.employee_id, e.salary,
              min(jh.job_id) keep (dense_rank first order by jh.start_date), 'f'
         from employees e inner join job_history jh
                          on e.employee_id = jh.employee_id
         group by e.employee_id, e.salary
     ),
     p ( employee_id, salary, job_id, status, avg_salary ) as (
       select u.employee_id, u.salary, u.job_id, u.status,
              (j.min_salary + j.max_salary) / 2
       from   u inner join jobs j on u.job_id = j.job_id
     )
select employee_id, nvl(first_job_id, crt_job_id) as first_job_id,
       nvl(first_avg_salary, crt_avg_salary) as first_avg_sal,
       crt_job_id, crt_avg_salary, salary
from p
pivot ( min(job_id) as job_id, min(avg_salary) as avg_salary 
        for status in ('f' as first, 'c' as cRT)
      )
;