Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每个部门的最高工资_Sql_Sql Server_Tsql - Fatal编程技术网

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