2012-04-13 42 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)