列出所有有薪水和薪水较高的员工

时间:2016-10-20 10:01:12

标签: sql-server tsql

我正在使用两张桌子

  • Employee(empid integer,mgrid integer,deptid integer,salary integer)
  • Dept(deptid integer,deptname text)

如何列出所有员工,他们的薪水以及他们部门中赚钱最多但比员工少的人的工资?

感谢您的帮助

4 个答案:

答案 0 :(得分:0)

这将做你想要的:

SELECT
    Employee.*
    , NextHighestEarner.*
FROM
    Employee
    INNER JOIN (
    SELECT
        Employee.empid
        , NextHighestEarnerID = (
            SELECT TOP 1
                empid
            FROM
                Employee EmployeeSub
            WHERE
                EmployeeSub.deptID = Employee.deptid
                AND EmployeeSub.Salary < Employee.Salary
            ORDER BY
                EmployeeSub.Salary DESC
            )
    FROM
        Employee) EmployeeAndNextHighestEarner ON Employee.empid = EmployeeAndNextHighestEarner.empid
    LEFT JOIN Employee NextHighestEarner ON EmployeeAndNextHighestEarner.NextHighestEarnerID = NextHighestEarner.empid

这应该允许您从员工和NextHighestEarner子查询中选择所需的任何详细信息。请注意NextHighestEarnerID中的相关子查询 - 这可能不适用于大型数据集。

答案 1 :(得分:0)

这可以通过outer apply到同一个表来实现:

declare @Employee table (empid integer, mgrid integer, deptid integer, salary integer);
declare @Dept table (deptid integer, deptname text);

insert into @Employee values
 (1,null,1,1000000)
,(2,1,1,10000)
,(3,1,1,1000)
,(4,3,1,100)
,(5,1,2,10)
,(6,5,2,1);

insert into @Dept values
 (1,'Finance')
,(2,'HR');

select e.*
        ,d.deptname
        ,es.salary as NextHighestSalary
from @Employee e
    inner join @Dept d
        on(e.deptid = d.deptid)
    outer apply(select top 1 empid
                from @Employee e2
                where e2.deptid = e.deptid
                    and e2.salary < e.salary
                order by e2.salary desc
                ) es

答案 2 :(得分:0)

select      empid
           ,salary
           ,(select max(salary) from Employee as e2 where e2.deptid = e.deptid and e2.salary < e.salary)

from        Employee as e
;

答案 3 :(得分:0)

欢迎来到SO。

很抱歉,但你在SQL中看起来很绿。 网上有很多教程和好的指南,这里有一些很好的问题。

你注意到你会收到一些评论和downvotes,因为你的问题显示缺乏努力,但不要让它阻止你(但在再次发布之前尝试学习更多)。

您还可以阅读有关how to to post a good question的帮助部分。

你的问题缺乏一些信息,但我想用你的requeriments创造一个很好的例子。使用它作为外键,聚合和其他基本概念的简单示例。

可以随意提出进一步的问题。

<g:formRemote useToken="true" ...>
     ...
     ...
 </g:formRemote>