SQL找到最大值然后找到它的发生
问题描述:
我不能得到这个工作。 我需要首先找到假期和病假小时的最大总和,然后找到哪些员工有这个价值的假期和病假小时数。我可以得到最高168,但无论我如何安排事情,我似乎都无法得到符合这一标准的员工 - 我只是得到所有员工的完整列表。下面的代码是最后一次尝试,根据班级的方向。谢谢!SQL找到最大值然后找到它的发生
SELECT e.employeeID, SUM(e.vacationhours + e.sickleavehours) AS maxHours
FROM humanresources.employee e
WHERE EXISTS (
SELECT SUM(e.vacationhours + e.sickleavehours) AS totalhours
FROM humanresources.employee e)
GROUP BY e.employeeID
答
我会去FO这一点,而不使用特定的SQL服务器语法。我想这应该在大多数DBMS的工作:
SELECT e.employeeID,
SUM(e.vacationhours + e.sickleavehours) AS totalHours
FROM humanresources.employee e
GROUP BY e.employeeID
HAVING SUM(e.vacationhours + e.sickleavehours) >= all
(SELECT SUM(e.vacationhours + e.sickleavehours) FROM humanresources
GROUP BY employeeID)
答
TOP WITH TIES
简化了这个问题...
如果你只是想谁拥有totalHours的最大数量的员工列表...你可以简单地相加顺序,选择顶部1,包括使之返回所有员工的最高值任何关系:
SELECT TOP 1 WITH TIES
e.employeeID,
SUM(e.vacationhours + e.sickleavehours) AS totalHours
FROM humanresources.employee e
GROUP BY e.employeeID
ORDER BY totalHours DESC;
答
你有一台名为employee
并在该表中,你有一个字段名为employeeID
。除非这是一个非常糟糕的命名,employeeID
是employee
表的主键。
有没有必要做一个group by
。您可以在where子句中过滤行。
select e.employeeID, e.vacationhours + e.sickleavehours as Hours
from employee as e
where e.vacationhours + e.sickleavehours = (select max(vacationhours + sickleavehours)
from employee)
这与我在想的相似......但我认为'having'中的子查询必须是'employee'的'sum'的最大值'...这让我想到使用cte删除重复...然后消除对'有'条款的需要...这使我怀疑到底是什么老师试图引出的问题... – 2012-04-13 17:51:59
谢谢!这就是我要做的 - 实际上刚刚发现了它。我离开了作为一个简单的最大函数的第二部分,我假设然后将总和和最大值等同于同一行,从而每次都得到我的整个员工表。 – Volvox 2012-04-13 17:52:49
@VOlvox,迈克尔是绝对正确的。我刚刚更新了答案。现在它应该是防弹的:)谢谢迈克尔:) – 2012-04-13 17:55:45