Oracle SQL запрос на соединение, чтобы найти самую высокую зарплату - PullRequest
0 голосов
/ 25 ноября 2018

Таким образом, у меня есть две таблицы зарплаты и emp, определение которых показано ниже

[enter image description here

Я пытаюсь создать запрос, который Найти сотрудника, который получает максимальную зарплату, иПоказать сведения о сотруднике вместе с национальностью.

Я создал этот запрос

select empcode,
       max(basic) as "Highest Sal"
 from salary 
    join emp on empcode;

Пожалуйста, помогите с этим

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Попробуйте это:

SELECT * FROM 
(SELECT E.EmpCode, E.EmpName, E.DOB, E.DOJ, E.DeptCode, E.DesgCode, E.PhNo, 
E.Qualification, E.Nationality, S.Basic, S.HRA, S.TA, S.UTA, S.OTRate 
FROM EMP AS E JOIN SALARY AS S ON (E.EmpCode = S.EmpCode) order by S.Basic desc) 
WHERE rownum = 1
0 голосов
/ 26 ноября 2018

Найдите сотрудника, который получает максимальную зарплату

Сотрудник может иметь несколько зарплат в вашей модели данных.Следовательно, (общая) зарплата работника является суммой этих.Вы хотите найти максимальную зарплату на одного работника и показать, что работники зарабатывают так много.

Вы можете использовать MAX OVER, чтобы найти максимальную сумму:

select e.*, s.total_salary
from emp e
join 
(
  select
    empcode, 
    sum(basic) as total_salary,
    max(sum(basic)) over () as max_total_salary
  from salary
) s on s.empcode = e.empcode and s.total_salary = s.max_total_salary
order by e.empcode;
0 голосов
/ 25 ноября 2018

В вашем запросе используется простой агрегат max(basic), который позволяет найти самую высокую зарплату.За исключением того, что вам нужно присоединиться к таблице EMP для отображения других деталей.Это означает, что вы не можете использовать агрегирование, потому что нам нужно GROUP BY для неагрегированных столбцов, что сделало бы бессмысленным запрос.

К счастью, мы можем решить проблему с помощью аналитической функции.Подзапрос выбирает всю соответствующую информацию и ранжирует каждого сотрудника по зарплате, причем ранг 1 является самым высокооплачиваемым.Мы используем rank() здесь, потому что это будет обрабатывать связи: два сотрудника с одинаковым basic будут в том же ранге.

select empcode
           , empname
           , nationality
           , "Highest Sal" 
from (
    select emp.empcode
           , emp.empname
           , emp.nationality
           ,  salary.basic as "Highest Sal" 
           , rank() over (order by salary.basic desc ) as rnk
    from salary join emp on emp.empcode = salary.empcode
)
where rnk = 1;
...