【问题标题】:Select MAX() causes error message选择 MAX() 导致错误消息
【发布时间】:2014-12-12 00:55:55
【问题描述】:

我需要创建一个 T-SQL 查询,该查询将返回 job_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)

但这会产生错误:

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

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

但是,它似乎只是不言自明的;问题可能出在MAX 函数上。删除后,结果为全名-工资表。我想知道为什么它不能只提取最大行...

【问题讨论】:

  • 好吧,消息告诉你错误是什么。您正在使用MAX,但您有另一列在聚合函数上没有,也没有在GROUP BY 上使用它。在查询末尾添加GROUP BY p.firstname+' '+p.lastname
  • @Lamak 与herbae 的回答相同-“不起作用- 结果与没有“MAX”函数(完整的薪金表)相同。”

标签: sql sql-server tsql


【解决方案1】:

如果只有一个员工可以得到Max salary,那么试试这个。

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 

如果不止一个获得最高薪水,则使用Window FunctionDense_Rank 查找所有姓名。

;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 WITH TIES 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 ties 关键字:select top 1 with ties . . .
  • @GordonLinoff - 感谢 Gordan 很高兴知道这一点。更新了答案
【解决方案2】:

试试这个:

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

【讨论】:

  • 虽然这是对的,但您还应该解释问题是什么才能使它成为一个好的答案
  • @pquest 实际上这可能是不正确的,因为它会给出每个人的最高薪水,我怀疑 OP 希望整个人的薪水最高。
  • @DavidG 啊,是的,再看一遍,我想你可能是对的。话虽如此,我评论的另一部分,即重要的部分,仍然有效。
  • @pquest 当然,没有解释的答案是不好的。
  • T sql 不支持在选择查询中结合聚合和非聚合表达式的这种语法
【解决方案3】:

终于找到了一个不那么难看的解决方案:

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”与“join”一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多