2012-04-13 60 views
2

我不能得到这个工作。 我需要首先找到假期和病假小时的最大总和,然后找到哪些员工有这个价值的假期和病假小时数。我可以得到最高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 

回答

2

我会去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) 
+0

这与我在想的相似......但我认为'having'中的子查询必须是'employee'的'sum'的最大值'...这让我想到使用cte删除重复...然后消除对'有'条款的需要...这使我怀疑到底是什么老师试图引出的问题... – 2012-04-13 17:51:59

+0

谢谢!这就是我要做的 - 实际上刚刚发现了它。我离开了作为一个简单的最大函数的第二部分,我假设然后将总和和最大值等同于同一行,从而每次都得到我的整个员工表。 – Volvox 2012-04-13 17:52:49

+0

@VOlvox,迈克尔是绝对正确的。我刚刚更新了答案。现在它应该是防弹的:)谢谢迈克尔:) – 2012-04-13 17:55:45

7

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; 
+2

创意和优雅;但可能不是老师会期待的。总结这里为Volvox所做的工作:迈克尔总结所有员工总时间排序结果,以便小时数最多的人出现在第一位,然后只返回包括关系在内的第一个结果。 – xQbert 2012-04-13 17:34:25

+0

+1“WITH TIES”。 – Lamak 2012-04-13 17:35:55

+1

+1有趣!感谢你,今后不得不看它...我不能提交这样的东西。 ;) – Volvox 2012-04-13 17:50:26

2

看看在Having条款

+1

可能与教师请求内联。 – xQbert 2012-04-13 17:34:56

0

你有一台名为employee并在该表中,你有一个字段名为employeeID。除非这是一个非常糟糕的命名,employeeIDemployee表的主键。

有没有必要做一个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)