3
 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 运营的每个员工的员工姓名。

我的查询解决方案:

 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')

但是这个查询对我不起作用我怎样才能得到这个?

4

2 回答 2

0

我认为最简单的解决方案就是加入所有表,然后从工作表中找到薪水等于最高薪水的员工。

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)
于 2020-05-06T14:09:52.990 回答
0

员工的收入是多少?

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

我们甚至可以扩展它来查看这是否是 Small Bank 员工:

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 Server 标记了您的请求并告诉我您收到此错误:

消息 130,级别 15,状态 1,第 126 行无法对包含聚合或子查询的表达式执行聚合函数

显然,SQL Server 的条件聚合存在问题。您可以通过加入公司表来规避这种情况:

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;
于 2020-05-06T14:40:14.690 回答