使用having子句选择具有最大值的行

时间:2017-01-27 09:27:59

标签: sql-server

create table Users
(
   ID int primary key,
   Username char(13) not null,
   Salary int,
   DepartmentID int,
   PCID int
);

insert into Users values (1, 'Jenson', 180000, 4,12);
insert into Users values (2, 'John', 161000, 2,11);
insert into Users values (3, 'Jack', 150000, 1,10);
insert into Users values (4, 'James', 150000, 3,9);
insert into Users values (5, 'Jeremy', 151000, 3,7);        

create table Departments
(
   ID int primary key,
   Name char(13) not null,
);

insert into Departments values (1, 'Programming');
insert into Departments values (2, 'Supply');
insert into Departments values (3, 'Medicine');
insert into Departments values (4, 'Economic');
insert into Departments values (5, 'Communication');

SELECT 
    s.dep_id as dep_id, s.Sum_Salary 
FROM
    (SELECT 
         d.ID AS dep_id, SUM(u.Salary) AS Sum_Salary 
     FROM
         dbo.users u
     INNER JOIN 
         Departments d ON u.DepartmentID = d.id
     GROUP BY 
         d.ID) s 

我可以从Department_idsum_salary

中进行选择

如何选择最大值为sum_salary的行选择行?不使用CTE或相同的方式。

2 个答案:

答案 0 :(得分:2)

您可以使用TOPORDER BY

SELECT TOP 1
    d.ID AS dep_id,
    sum(u.Salary) AS Sum_Salary
from dbo.users u
INNER JOIN Departments d ON u.DepartmentID=d.id
GROUP BY d.ID
order by Sum_Salary desc;

它将以最大Sum_salary返回前1行。

如果您只想查找最大sum_salary,请使用MAX

SELECT 
    MAX(s.Sum_Salary)
FROM
    (SELECT 
         SUM(u.Salary) AS Sum_Salary 
     FROM
         dbo.users u
     INNER JOIN 
         Departments d ON u.DepartmentID = d.id
     GROUP BY 
         d.ID) s 

答案 1 :(得分:1)

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER( ORDER BY SUM_SALARY DESC) AS RN FROM (SELECT D.ID AS DEP_ID ,SUM(U.SALARY) AS SUM_SALARY FROM DBO.USERS U
INNER JOIN DEPARTMENTS D ON U.DEPARTMENTID=D.ID
GROUP BY D.ID )A 
)
SELECT SUM_SALARY,  RN
 FROM CTE WHERE RN=1

OR

SELECT D.ID AS DEP_ID ,SUM(U.SALARY) AS SUM_SALARY FROM DBO.USERS U
INNER JOIN DEPARTMENTS D ON U.DEPARTMENTID=D.ID
GROUP BY D.ID 
HAVING SUM(U.SALARY) = (SELECT TOP 1 SUM(U.SALARY) AS SUM_SALARY FROM DBO.USERS U
INNER JOIN DEPARTMENTS D ON U.DEPARTMENTID=D.ID
GROUP BY D.ID
ORDER BY  SUM_SALARY DESC)