我正在尝试返回
的列•员工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
答案 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)
)
;