Запрос на получение зарплаты сотрудника - PullRequest
3 голосов
/ 06 мая 2020
 Insert into Employee values (1,'Abdul Rehman','Street No 12','Kamra Kalan')
 Insert into Employee values (2,'Iram Bhatti','Street No 10','Attock')
 Insert into Employee values (3,'Danial Aziz','Street No 12','Kamra Kalan')
 Insert into Employee values (4,'Kashif Butt','Street No 10','Attock')
 Insert into Employee values (5,'Zohaib Butt','Street No 13','Peshawar')


 insert into Company values (1,'First Bank Co-Operation','Hydrabaad');
 insert into Company values (2,'Small Bank Co-Operation','Kashmir');



 Insert  into Works  values (1,2,5000)
 Insert  into Works  values (2,1,40000)
 Insert  into Works  values (1,3,56000)
 Insert  into Works  values (1,4,8000)
 Insert  into Works  values (2,2,78000)

Вопрос: Напишите запрос для получения имен сотрудников, которые зарабатывают больше, чем каждый сотрудник Small Bank Co operation.

Мой запрос Решение:

 Select Employee.person_name from Works
 inner join Employee on Employee.person_Id
 =Works.Person_Id inner join Company on
 Company.Company_Id=Works.Company_Id
and  Salary>(Select Salary from works 
 Where Company.Company_name='Small Bank Co-Operation')

Но это запрос не работает у меня как я могу получить его?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Сколько зарабатывает сотрудник?

select person_id, sum(salary)
from works
group by person_id;

Мы можем даже расширить это, чтобы увидеть, является ли это сотрудник малого банка:

select
  person_id,
  sum(salary),
  max(case when Company_Id = 
                (select Company_Id from company where company_name = 'Small Bank Co-Operation')
      then 1 else 0 end
  ) as is_small_banker
from works
group by person_id;

Теперь используйте это для сравнения:

with salaries as
(
  select
    person_id,
    sum(salary) as total,
    max(case when Company_Id = 
                  (select Company_Id from company where company_name = 'Small Bank Co-Operation')
        then 1 else 0 end
    ) as is_small_banker
  from works
  group by person_id
)
select e.person_name
from employee e 
join salaries s on s.person_id = e.person_id
where total > all
(
  select total
  from salaries
  where is_small_banker = 1
)
order by e.person_name;

Это всего лишь один из способов сделать это. Вы можете сделать то же самое, например, с NOT EXISTS (т.е. там, где не существует работника малого банка с такой же или более высокой зарплатой).


Обновить

Тем временем вы отметили свой запрос с сервером SQL и сказал мне, что вы получаете эту ошибку:

Msg 130, Level 15, State 1, Line 126 Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос

Очевидно, SQL Сервер имеет проблемы с условным агрегированием. Вы можете обойти это, присоединившись к таблице compabny вместо этого:

with salaries as
(
  select
    w.person_id,
    sum(w.salary) as total,
    max(case when c.company_name = 'Small Bank Co-Operation' then 1 else 0 end
       ) as is_small_banker
  from works w
  join company c on c.company_Id = w.company_Id
  group by w.person_id
);

Обновление 2

Если в таблице works может быть только одна работа (компания и зарплата) на сотрудника, весь запрос уменьшится до:

select e.person_name
from employee e 
join works w on w.person_id = e.person_id
where salary > all
(
  select salary
  from works
  where id_company =
    (select company_Id from company where company_name = 'Small Bank Co-Operation')
)
order by e.person_name;
0 голосов
/ 06 мая 2020

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

SELECT e.person_name
FROM employee e inner join works w
on e.person_Id = w.Person_Id
inner join company c
on w.Company_Id = c.Company_Id
WHERE c.Company_name = 'Small Bank Co-Operation'
and w.Salary = (SELECT max(works.Salary)
                FROM works)
...