消息8120:列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

时间:2015-12-08 03:32:05

标签: sql-server

我在SQL Server 2012中有EMP表:

CREATE TABLE EMP
(
    [ID] INT NOT NULL PRIMARY KEY,
    [MGR_ID] INT, 
    [DEPT_ID] INT, 
    [NAME] VARCHAR(30), 
    [SAL] INT, 
    [DOJ] DATE
) 

当我执行此查询时

Select NAME, MAX(SAL) as Salary FROM EMP;

我遇到了这个错误:

  

Msg 8120,Level 16,State 1,Line 1

     

列'EMP.NAME'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

请帮忙

P.S。

上述错误的原因可能是NAME列中有多行,而MAX聚合函数只返回一行。

评论戈登的回答:

  

我实际上想要返回薪水第二高的员工姓名

3 个答案:

答案 0 :(得分:0)

Select Name, Max(sal) as salary from employee group by Name

因此,当您在sql中使用任何聚合函数(如count,max,min等)时,我们必须从选择列表中指定那些我们想要成为结果集的分组列的列

答案 1 :(得分:0)

如果您希望名称与最高薪水相关联,请使用TOPORDER BY

select top 1 name, sal
from employee
order by sal desc;

如果您想要所有值,即使有关系,也请使用TOP WITH TIES

答案 2 :(得分:0)

根据您的评论,您希望返回薪水第二高的员工姓名。您需要使用DENSE_RANK来实现此目的:

;WITH Cte AS(
    SELECT *,
        RN = DENSE_RANK() OVER(ORDER BY SAL DESC)
    FROM UsrLic
)
SELECT
    NAME, SAL
FROM Cte
WHERE RN = 2