2012-05-04 45 views
2

這是我在Stack Overflow上的第一篇文章,我有一個相對簡單的初學SQL問題。 我的任務是爲我們的數據庫中的每位員工查找遲到時間表提交的次數。有兩張表我主要看過,但是我很難將兩張表合在一起,並且提出了與他們相關的發生次數和員工ID的正確視圖。計算子查詢中出現的次數

我已經創建了這個查詢,它爲我提供了每個發生的EmployeeID

SELECT db.Employee.EmployeeID 
FROM db.LateTimesheets 
INNER JOIN db.Employee ON Employee.LastName = LateTimesheets.LastName AND Employee.FirstName = Late Timesheets.FirstName 

現在,這個簡單的查詢我有EmployeeID的觀點反覆然而很多時候,這些事件時有發生。但是,我最終想要得到的是一個表格,它顯示每次發生的計數以及與此計數相關聯的EmployeeID

我會假設我需要使用COUNT()函數來計算每個EmployeeID的行數,然後選擇該值以及EmployeeID。但是,我在正確構造子查詢時遇到了問題,到目前爲止,我所嘗試的所有內容都只會在MS SQL Server Management Studio中產生錯誤。

任何幫助,將不勝感激。先謝謝了!

回答

0
select e.*, isnull(lt.Count, 0) as Count 
from Employee e 
left join (
select LastName, count(*) as Count from LateTimesheets 
) LateTimesheets lt on e.LastName = lt.LastName 

訣竅是在派生表中進行分組。你不想分組所有東西,只是LateTimesheets。

我們需要一個左連接仍然沒有LateTimesheets的員工。

+0

感謝您的答覆! – Burzum619

1

我可能誤解了這個問題,但不會GROUP BY解決你的問題?

SELECT COUNT(db.LateTimesheets.somecolumn), db.Employee.EmployeeID 
FROM db.LateTimesheets 
INNER JOIN db.Employee ON Employee.LastName = LateTimesheets.LastName 
    AND Employee.FirstName = Late Timesheets.FirstName 
GROUP BY db.Employee.EmployeeID 

只是一列,實際上是在表的名稱替換somecolumn

+0

不返回連接沒有行的行。那麼我想OP會希望計數爲0。 – usr

+0

@usr我們可以猜出所有我們喜歡的,他們可以說。如果他們不關心沒有遲到時間表的人(我不明白他們爲什麼會這樣做),那麼這應該做他們需要的一切。 –

+0

我嘗試了一個類似於Anthony發佈的查詢,並且似乎在吐出一些好看的數據。我想我應該回顧一下GROUP BY命令實際做了什麼,但看起來這是我正在尋找的答案。 「usr」,你能澄清你的意思嗎? – Burzum619

2

usr的答案的一個簡化版本是避免了派生表的結構如下:

Select db.Employee.EmployeeID, Count(db.LateTimesheets.somecolumn) As Total 
From db.Employee 
    Left Join db.LateTimesheets 
     On LateTimesheets.LastName = Employee.LastName 
      And Late Timesheets.FirstName = Employee.FirstName 
Group By db.Employee.EmployeeID 
+0

這適用於計算一個表,但如果要執行多個連接和多個子計數,則不構成。它的工作更是巧合。 – usr

+0

@usr - 它的工作原理並不是巧合。它給出了問題的參數。這可以通過簡單地使用Count(Distinct(...)來處理多個連接,在這個問題中,我們只會被告知兩個表格,如果有20個表格,那麼會引出一個不同的解決方案,方法)需要改變。 – Thomas