【问题标题】:Query For getting the Salary of employee查询员工工资
【发布时间】:2020-08-21 12:26:21
【问题描述】:
 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')

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

【问题讨论】:

  • Create Table Employee ( person_Id int primary key , person_name varchar (100), street varchar(100), City varchar(100) ) Create table Works( Company_Id int, Person_Id int, Salary int ) Create Table Company( Company_Id int Primary key , Company_name varchar(100), Company_City varchar(100) )
  • 您的子查询错误。首先关注这一点:编写一个完整的查询,其中包含任何必要的连接,它返回 Small Bank 任何人的最高薪水。作为提示,您应该以select max(Salary) 开头。一旦你得到这个工作,只返回一个数字,你就可以把它放回你的原始查询中。
  • 但是他们让我选择员工的名字而不是薪水
  • 是的,但是在你找到Small Bank的工资超过最高工资的员工姓名之前,你需要找到Small Bank的最高工资。所以解决这个问题,然后使用您编写的查询在您的主查询中找到它。
  • @ALI,单独考虑数据表,首先想办法获取所有必要信息,然后专注于获得最高薪水

标签: sql sql-server sql-server-2008


【解决方案1】:

员工的收入是多少?

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;

【讨论】:

  • Msg 130, Level 15, State 1, Line 126 Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
  • 好的,您正在使用一些不支持聚合内的子查询的 DBMS(奇怪的是,您仍然保密)。然后将 company 表加入到works 表中,这样您就可以直接访问公司名称。
  • 不,我想从员工表中获取员工姓名,这就是为什么我也使用员工表。
  • 我要做的就是获取那些薪水超过每个小型银行合作公司员工薪水的员工的姓名
  • 我做到了。我描述了如何更改我的查询。再次:删除整个with 子句并将salaries 更改为workstotal 更改为salary
【解决方案2】:

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

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)

【讨论】:

  • 那不是我需要的
  • 我认为您当时的问题措辞不正确。实际上,这确实返回了“小银行合作”中薪水最高的员工的姓名。如果几个员工的薪水与最高工资相同,它将返回他们的所有姓名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多