我正在使用两张桌子
Employee
(empid integer,mgrid integer,deptid integer,salary integer)Dept
(deptid integer,deptname text)如何列出所有员工,他们的薪水以及他们部门中赚钱最多但比员工少的人的工资?
感谢您的帮助
答案 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>