Sql 每个部门的最高工资
我有一张桌子,上面有详细信息:Sql 每个部门的最高工资,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张桌子,上面有详细信息: 我需要查询每个部门的最高工资。假设SQL Server 2005+ WITH cteRowNum AS ( SELECT DeptID, EmpName, Salary, DENSE_RANK() OVER(PARTITION BY DeptID ORDER BY Salary DESC) AS RowNum FROM EmpDetails ) SELECT DeptID, EmpName, Salary FR
我需要查询每个部门的最高工资。假设SQL Server 2005+
WITH cteRowNum AS (
SELECT DeptID, EmpName, Salary,
DENSE_RANK() OVER(PARTITION BY DeptID ORDER BY Salary DESC) AS RowNum
FROM EmpDetails
)
SELECT DeptID, EmpName, Salary
FROM cteRowNum
WHERE RowNum = 1;
按部门从EMPTID详细信息组中选择部门,MAXSalary 上面的查询是可接受的答案,但它不适用于以下场景。假设我们必须在下表中找到每个部门工资最高的员工 部门编号 EmpName 薪水 工程师 山姆 1000 工程师 史密斯 2000 工程师 汤姆 2000 人力资源 丹尼斯 1500 人力资源 丹尼 3000 信息技术 大卫 2000 信息技术 约翰 3000
如果您只想从该表中获得最高工资,请按部门划分:
SELECT MAX(Salary) FROM TableName GROUP BY DeptID
呃,比如:
select
d.DeptID,
max(e.Salary)
from
department d
inner join employees e on d.DeptID = e.DeptID
group by
d.DeptID
下面是一种在任何版本的SQL上获取最大值和名称的方法 测试数据:
CREATE TABLE EmpDetails(DeptID VARCHAR(10), EmpName VARCHAR(10), Salary DECIMAL(8,2))
INSERT INTO EmpDetails VALUES('Engg','Sam',1000)
INSERT INTO EmpDetails VALUES('Engg','Smith',2000)
INSERT INTO EmpDetails VALUES('HR','Denis',1500)
INSERT INTO EmpDetails VALUES('HR','Danny',3000)
INSERT INTO EmpDetails VALUES('IT','David',2000)
INSERT INTO EmpDetails VALUES('IT','John',3000)
例如:
SELECT ed.DeptID
,ed.EmpName
,ed.Salary
FROM (SELECT DeptID, MAX(Salary) MaxSal
FROM EmpDetails
GROUP BY DeptID)AS empmaxsal
INNER JOIN EmpDetails ed
ON empmaxsal.DeptID = ed.DeptID
AND empmaxsal.MaxSal = ed.Salary
虽然不是最优雅的,但它很有效。如果部门、薪资和员工姓名在同一个表中,这将起作用
select ed.emp_name, ed.salary, ed.dept from
(select max(salary) maxSal, dept from emp_dept group by dept) maxsaldept
inner join emp_dept ed
on ed.dept = maxsaldept.dept and ed.salary = maxsaldept.maxSal
还有比这更好的解决方案吗?如果您还想显示其他参数以及DeptId和Salary,如EmpName、EmpId
这是ORACLE最好的解决方案:
Select * from (select customerid, city, freight,
row_number() over (partition by customerid order by freight desc) Row_Number from
(select orders.orderId, customers.CUSTOMERID, customers.city, orders.FREIGHT from orders inner join customers on orders.customerid = customers.customerid where customers.country='Germany' order by customers.customerid, orders.freight desc)
order by customerid, freight desc) where Row_Number<=2;
注意这里我使用了partitionby子句来标记行号,这主要是因为我们需要根据客户id对记录进行分区,并将它们分组。我在这里使用了两个内部查询。最内部的查询是提供一个视图,该视图根据客户ID和成本降序排序。现在,我们需要始终获取前两条记录,因此首先需要命名它们,然后根据rownum对它们进行筛选。第二级查询是根据客户ID标记rownum,最终查询将根据rownum过滤结果。对于每个分区。使用以下命令
SELECT A.*
FROM @EmpDetails A
INNER JOIN ( SELECT DeptID ,
MAX(salary) AS salary
FROM @EmpDetails
GROUP BY DeptID
) B ON A.DeptID = B.DeptID
AND A.salary = B.salary
ORDER BY A.DeptID
不知道为什么没有人提到这个团体。。。。有语法的。 它专门针对这些要求
select EmpName,DeptId,Salary from EmpDetails group by DeptId having Salary=max(Salary);
这个查询可以很好地工作,但是如果您想获取与薪资最高的员工相关的其他一些详细信息,那么这个查询就会出现矛盾。
您可以使用:
SELECT DepatID, a , b, c
FROM EmpDetails
WHERE Salary IN (
SELECT max(Salary)
FROM EmpDetails
GROUP BY DeptID
);
如果您将使用上一个查询,它将只反映最小val的记录,而不反映您使用最大功能时的薪资记录。请使用以下问题:
SELECT
DeptID,
Salary
FROM
EmpDetails
GROUP BY
DeptID
ORDER BY
Salary desc
select employee_name,salary,department_id from emp where salary in(select max(salary) from emp group by department_id);
我希望它能起作用
select * from (
select a.* from EmpDetails a
right join (select DeptID,max(salary) as Salary from EmpDetails group by DeptID) b
on b.DeptID=a.DeptID and b.salary=a.salary ) as c group by c.DeptID;
首先,按工资降序排列每位员工的最高工资
排名1,然后仅选择部门、员工姓名和薪资。你可以为我做这件事
该组的所有第n个成员 如果您想要部门和最高工资,请使用
SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
如果希望在员工和部门中有更多列,请使用
select Department.Name , emp.Name, emp.Salary from Employee emp
inner join (select DeptID, max(salary) [salary] from employee group by DeptID) b
on emp.DeptID = b.DeptID and b.salary = emp.Salary
inner join Department on emp.DeptID = Department.id
order by Department.Name
如果在中使用薪资,请选择maxsalary。。。这样,一个人在另一个部门有相同的工资,那么它将失败。使用相关子查询:
SELECT DeptID, EmpName, Salary
FROM EmpDetails a
WHERE Salary = (SELECT MAX(Salary)
FROM EmpDetails b
WHERE a.DeptID = b.DeptID)
下面的查询将显示员工姓名及其各自的部门名称,其中该特定员工姓名的薪资最高
with T as
(select empname, employee.deptno, salary
from employee
where salary in (select max(salary)
from employee
group by deptno))
select empname, deptname, salary
from T, department
where T.deptno=department.deptno;
我在Oracle数据库上成功执行了上述查询。下面列出的查询将列出每个部门的最高工资
with ctesal as (
select DepartmentId , Name , Salary, ROW_Number() OVER (partition by DepartmentId
order by Salary desc) as RowNum
from dbo.Employee
)
select DepartmentId , Name , Salary , RowNum from ctesal where RowNum =2;
选择部门名称、部门中的maxsalary、员工所在位置
department.deptno=employee.deptno按部门名称分组;
我在Oracle数据库上成功执行了此查询
with ctesal as (
select DepartmentId , Name , Salary, ROW_Number() OVER (partition by DepartmentId
order by Salary desc) as RowNum
from dbo.Employee
)
select DepartmentId , Name , Salary , RowNum from ctesal where RowNum =2;
这适用于SQL server。
ROW_Number是SQL server中的内置函数。它根据partition by和order by子句提供从1开始的计数。最后,我们可以根据我们的需求编写where条件。我有两种方法,一种是使用秩,另一种是使用行号
select EmpName,DeptId,Salary from EmpDetails group by DeptId having Salary=max(Salary);
这是我的样本数据
Age Name Gender Salary
----------- -------------------------------------------------- ---------- -----------
1 Mark Male 5000
2 John Male 4500
3 Pavan Male 5000
4 Pam Female 5500
5 Sara Female 4000
6 Aradhya Female 3500
7 Tom Male 5500
8 Mary Female 5000
9 Ben Male 6500
10 Jodi Female 7000
11 Tom Male 5500
12 Ron Male 5000
13 Ramani Female 7000
这是我的第一个查询,查找最高工资和每个性别的最高工资的人
with CTE as(
select RANK() over(partition by Gender Order by Salary desc) as [Rank],* from employees)
select * from CTE where [Rank]=1
Rank Age Name Gender Salary
-------------------- ----------- -------------------------------------------------- ---------- -----------
1 10 Jodi Female 7000
1 13 Ramani Female 7000
1 9 Ben Male 6500
所以在这个案例中,我们可以看到这两名女员工Jodi和Ramani之间有联系。在这种情况下,作为一个打破平局的人,我想利用年龄作为一个决定因素,应该展示年龄更大的人
with CTE as(
select RANK() over(partition by Gender Order by Salary desc,age desc) as [Rank],* from employees)
select * from CTE where [Rank]=1
Rank Age Name Gender Salary
-------------------- ----------- -------------------------------------------------- ---------- -----------
1 13 Ramani Female 7000
1 9 Ben Male 6500
通常,在这种情况下,为了找到最高的薪水,即使
使用秩、密秩或行数。但它们在其他情况下也有一些影响。没有评论为什么密集排列超过行数?这是卑鄙的:[+1表示卑鄙]@Dems我从来不是故意卑鄙的既然你提出了这个问题,我要澄清的是,这里使用的密集等级是为了考虑到每个部门中可能有一名以上的员工拥有最高工资。这里的缺点是它没有指定谁拥有最高工资,而只指定最高工资是多少[见Joe的答案]。但如果这就是所需要的,这几乎是你能得到的最好的结果:@AVee有没有办法只显示工资最高的部门,而不使用子查询?我不完全确定你的意思,但如果你只想要一个结果,将前1名添加到“选择并按MAXSalary排序”中。要查找第二高薪部门,请使用相同的问题?有人能帮忙吗?只有一个表employee这里我写了一个相关子查询来查找每个部门的最高工资。对于EMP表中的每个员工,它会将其工资与ma进行比较
同一部门的最高工资。如果匹配,则表示该员工在其所在部门获得最高工资。仅此而已..我想在您的答案中添加上下文。相关子查询效率非常低,它将为外部句子中的每条记录运行子查询。我认为这不起作用,因为您的内部查询将返回多个列,并且in需要一个值。我认为此查询风险很大,因为在子查询中,您将有每个部门的所有最高工资的列表,比如100K[“销售”]、120K[“营销”]、130K[“它”]。然后,一名员工的工资为10万英镑,这是不正确的。我是否遗漏了什么?如果与其他员工的工资记录相匹配,这是否会造成混乱?例如,在第条中,A部门和B部门的工资分别为“20”、“30”。现在,如果B部门中有一名员工的工资为20,则会显示结果,对吗?@SnehalMasne Yes this w我一定会搞砸的。这不是正确答案选择s1.姓名,s1.站,s1.员工工资s1,其中s1.工资在选择MAXs2.员工工资s2组按s2.站有s1.站=s2。Station@RamGrandhi检查Having子句以避免这种混乱。这应该是-SELECT e1。empName,e1.empDept,e1.EmpSalary FROM Employee e1其中e1.EmpSalary在e2中选择maxe2.EmpSalary作为Employee e2组中的薪资由e2.empDept拥有e1.empDept=e2.EmpDeptmaxsalary不是一个条目它返回一个列表,我们如何与=号进行比较,它应该在运算符中使用,因为您使用的是GROUP子句。这里的逻辑完全错误,它返回每个组中没有最高工资的第一个emp。嗨,为什么你需要最后一个“c.DeptId的c组”?我不明白这一点。
select empno
from EMP e
where salary=(select max(sal)
from EMP w
where groupby w.deptno having e.deptno=w.deptno)
select * from (
select a.* from EmpDetails a
right join (select DeptID,max(salary) as Salary from EmpDetails group by DeptID) b
on b.DeptID=a.DeptID and b.salary=a.salary ) as c group by c.DeptID;
select deptid, empname, salary from
(Select deptid, empname,salary,
rank() Over(Partition by deptid order by salary desc)as rank from
EmpDetails) emp
where emp.rank = 1
SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
select Department.Name , emp.Name, emp.Salary from Employee emp
inner join (select DeptID, max(salary) [salary] from employee group by DeptID) b
on emp.DeptID = b.DeptID and b.salary = emp.Salary
inner join Department on emp.DeptID = Department.id
order by Department.Name
SELECT DeptID, EmpName, Salary
FROM EmpDetails a
WHERE Salary = (SELECT MAX(Salary)
FROM EmpDetails b
WHERE a.DeptID = b.DeptID)
with T as
(select empname, employee.deptno, salary
from employee
where salary in (select max(salary)
from employee
group by deptno))
select empname, deptname, salary
from T, department
where T.deptno=department.deptno;
with ctesal as (
select DepartmentId , Name , Salary, ROW_Number() OVER (partition by DepartmentId
order by Salary desc) as RowNum
from dbo.Employee
)
select DepartmentId , Name , Salary , RowNum from ctesal where RowNum =2;
Age Name Gender Salary
----------- -------------------------------------------------- ---------- -----------
1 Mark Male 5000
2 John Male 4500
3 Pavan Male 5000
4 Pam Female 5500
5 Sara Female 4000
6 Aradhya Female 3500
7 Tom Male 5500
8 Mary Female 5000
9 Ben Male 6500
10 Jodi Female 7000
11 Tom Male 5500
12 Ron Male 5000
13 Ramani Female 7000
with CTE as(
select RANK() over(partition by Gender Order by Salary desc) as [Rank],* from employees)
select * from CTE where [Rank]=1
Rank Age Name Gender Salary
-------------------- ----------- -------------------------------------------------- ---------- -----------
1 10 Jodi Female 7000
1 13 Ramani Female 7000
1 9 Ben Male 6500
with CTE as(
select RANK() over(partition by Gender Order by Salary desc,age desc) as [Rank],* from employees)
select * from CTE where [Rank]=1
Rank Age Name Gender Salary
-------------------- ----------- -------------------------------------------------- ---------- -----------
1 13 Ramani Female 7000
1 9 Ben Male 6500