我有一个名为customers
的表。
我试图获得薪水最高的人的姓名和工资。
所以我试过这个:
SELECT name, salary AS MaxSalary
FROM CUSTOMERS
GROUP BY salary
HAVING salary = max(salary)
不幸的是,我收到了这个错误:
专栏' CUSTOMERS.name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
我知道我应该在group by
子句中添加name列,但是我得到了表的所有记录。
我知道我可以通过以下方式实现:
SELECT name, salary
FROM CUSTOMERS
WHERE salary = (SELECT MAX(salary) FROM CUSTOMERS)
但我想通过group by
和having
条款来实现它。
答案 0 :(得分:3)
此要求并不适合group by
和having
解决方案。假设您使用的是现代版本的MS SQL Server,最简单的方法是使用rank
窗口函数:
SELECT name, salary
FROM (SELECT name, salary, RANK() OVER (ORDER BY salary DESC) rk
FROM customers) c
WHERE rk = 1
答案 1 :(得分:1)
Mureinik的answer排名很好,但如果你因为某种原因不想要一个窗口函数,你可以使用CTE或子查询。
with mxs as (
select
max(salary) max_salary
from
customers
)
select
name
,salary
from
customers cst
join mxs on mxs.max_salary = cst.salary
答案 2 :(得分:-1)
你知道,没有必要在那里使用group by和having子句。但是如果你想使用它们,那么查询应该是
SELECT name, salary
FROM CUSTOMERS
GROUP BY salary
having salary = (select max(salary) from CUSTOMERS)