Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 Select MAX()会导致错误消息_Sql_Sql Server_Tsql - Fatal编程技术网

Sql Select MAX()会导致错误消息

Sql Select MAX()会导致错误消息,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要创建一个T-SQL查询,该查询将从job\u positions表中返回最高工资以及拥有该工资的人员的姓名 到目前为止,我的解决方案是: SELECT MAX(e.salary) AS [Max salary] , p.firstname + ' ' + p.lastname AS [THE LUCKY MAN] FROM persons p JOIN job_positions e ON (p.id_person = e.id_person) 但

我需要创建一个T-SQL查询,该查询将从
job\u positions
表中返回最高工资以及拥有该工资的人员的姓名

到目前为止,我的解决方案是:

SELECT 
    MAX(e.salary) AS [Max salary]
    , p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
FROM 
    persons p 
JOIN 
    job_positions e ON (p.id_person = e.id_person)
但这会产生错误:

Msg 8120,16级,状态1,第67行
列“persons.firstname”在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句

Msg 8120,16级,状态1,第67行
列“persons.lastname”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中


然而,这似乎是不言自明的;问题可能出在
MAX
功能上。删除后,结果为全名薪资表。我想知道为什么它不能只提取最大行…

如果只有一个员工可以获得
最大工资
,那么试试这个

SELECT TOP 1 e.salary                       AS [Max salary],
             p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
FROM   persons p
       JOIN job_positions e
         ON ( p.id_person = e.id_person )
ORDER  BY e.salary DESC 
如果多个获得最高工资,则使用
窗口功能
密集等级
查找所有姓名

;WITH cte
     AS (SELECT Dense_rank()
                  OVER (
                    ORDER BY e.salary)         Rn,
                e.salary                       AS [Max salary],
                p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
         FROM   persons p
                JOIN job_positions e
                  ON ( p.id_person = e.id_person ))
SELECT *
FROM   cte
WHERE  Rn = 1 


如果只有一名员工可以获得
最高工资,请尝试此操作

SELECT TOP 1 e.salary                       AS [Max salary],
             p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
FROM   persons p
       JOIN job_positions e
         ON ( p.id_person = e.id_person )
ORDER  BY e.salary DESC 
如果多个获得最高工资,则使用
窗口功能
密集等级
查找所有姓名

;WITH cte
     AS (SELECT Dense_rank()
                  OVER (
                    ORDER BY e.salary)         Rn,
                e.salary                       AS [Max salary],
                p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
         FROM   persons p
                JOIN job_positions e
                  ON ( p.id_person = e.id_person ))
SELECT *
FROM   cte
WHERE  Rn = 1 

试试这个:

SELECT MAX(e.salary) AS [Max salary],
p.firstname+' '+p.lastname AS [THE LUCKY MAN]
FROM persons p JOIN job_positions e ON (p.id_person = e.id_person)
GROUP BY p.firstname, p.lastname -- group by clause needed
试试这个:

SELECT MAX(e.salary) AS [Max salary],
p.firstname+' '+p.lastname AS [THE LUCKY MAN]
FROM persons p JOIN job_positions e ON (p.id_person = e.id_person)
GROUP BY p.firstname, p.lastname -- group by clause needed

最终找到了一个并非完全丑陋的解决方案:

SELECT 
    MAX(e.salary) AS [Max salary]
    , p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
FROM 
    persons p 
JOIN 
    job_positions e ON (p.id_person=e.id_person)
WHERE
    e.salary=(SELECT max(e.salary) FROM e.job_positions)

但我仍然想知道为什么不能将“MAX”与select和“join”一起使用。

最终找到了一个不完全难看的解决方案:

SELECT 
    MAX(e.salary) AS [Max salary]
    , p.firstname + ' ' + p.lastname AS [THE LUCKY MAN]
FROM 
    persons p 
JOIN 
    job_positions e ON (p.id_person=e.id_person)
WHERE
    e.salary=(SELECT max(e.salary) FROM e.job_positions)


但我仍然想知道,为什么不能将“MAX”与“select”和“join”一起使用呢。您使用的是
MAX
,但您有另一个列,该列在聚合函数中没有,也没有在
分组依据中使用。将
分组按p.firstname+''+p.lastname
添加到列表末尾query@Lamak与Herbe的回答相同——“不起作用——结果与没有“MAX”函数(全薪名表)的结果相同。”“好吧,消息告诉你错误是什么。您使用的是
MAX
,但您有另一个列,该列在聚合函数中没有,也没有在
分组依据中使用。将
分组按p.firstname+''+p.lastname
添加到列表末尾query@Lamak与Herbe的回答相同——“不起作用——结果与没有“MAX”函数(全薪名表)的结果相同。”“虽然这是正确的,你也应该解释一下问题是什么使这成为一个好的选择answer@pquest事实上,这可能是不对的,因为它会给出每人的最高工资,而我怀疑OP想要的是总工资最高的人。@DavidG啊,是的,再看看,我想你可能是对的。话虽如此,我的评论的另一部分,也就是重要的部分,仍然站得住脚。@pquest绝对,没有解释的答案是不好的。T sql不支持在select QUERY中将聚合表达式和非聚合表达式组合在一起的语法,尽管这是正确的,你也应该解释一下问题是什么使这成为一个好的选择answer@pquest事实上,这可能是不对的,因为它会给出每人的最高工资,而我怀疑OP想要的是总工资最高的人。@DavidG啊,是的,再看看,我想你可能是对的。话虽如此,我评论的另一部分,也就是最重要的部分,仍然站得住脚,如果没有解释,答案是不好的。sql不支持在选择查询中将聚合表达式和非聚合表达式组合在一起的这种语法。如果您想要重复,您也可以使用
和ties
关键字:
选择带ties的top 1@GordonLinoff-谢谢Gordan很高兴知道这一点。更新了答案如果您想要重复答案,您也可以使用带领带的
关键字:
选择带领带的前1名@GordonLinoff-谢谢Gordan很高兴知道这一点。更新了答案