2010-05-04 81 views
0
SELECT TOP (100) PERCENT dbo.EmployeeInfo.id, MIN(dbo.EmployeeInfo.EmpNo) AS EmpNo, 
      SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken 
FROM dbo.EmployeeInfo LEFT OUTER JOIN dbo.LeaveApplications ON 
      dbo.EmployeeInfo.id = dbo.LeaveApplications.EmployeeID 
WHERE (YEAR(dbo.LeaveApplications.ApplicationDate) = YEAR(GETDATE())) 
GROUP BY dbo.EmployeeInfo.id, dbo.EmployeeMaster.EmpNo 
ORDER BY DaysTaken DESC 

的基本功能,我想要的是檢索表dbo.EmployeeInfo的所有記錄,不論表dbo.LeaveApplications是否存在相應的記錄。如果EmployeeInfo排在LeaveApplications沒有相關的行,我想回到它的SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken柱爲NULL,或者甚至可能把0問題將where子句的T-SQL LEFT OUTER JOIN查詢

有了上面的查詢,如果我刪除了where條件,我能達到什麼樣的我想,但問題是我也想從LeaveApplication返回相關的行,只有當ApplicationDate在當前年份。

與WHERE條件添加

現在,我只能從EmployeeInfo獲得行,只有當他們在LeaveApplications相應的行但我只是想所有EmployeeInfo

+0

你有什麼要發生,如果沒有相應的'LeaveApplications'?它應該在返回行的where子句中做什麼? – Oded 2010-05-04 10:03:28

+0

如果沒有LeaveApplications,我仍然想返回EmployeeInfo中的所有行,然後爲dbo.LeaveApplications.DaysAuthorised查詢結果列指定一個NULL值,甚至0。 – StackTrace 2010-05-04 10:39:19

+0

可能我應該補充一點,即使在LeaveApplications中有0個相關的行,我仍然想要檢索EmployeeInfo中的所有記錄,然後爲每個返回的行顯示「DaysAuthorised」列的0(零)。 – StackTrace 2010-05-04 10:43:13

回答

0

您可以在WHERE子句添加一個測試NULL ,這可能會導致您的SUM返回NULL以及對不上LeaveApplications表中存在行:

SELECT TOP (100) PERCENT dbo.EmployeeInfo.id, MIN(dbo.EmployeeInfo.EmpNo) AS EmpNo, 
      SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken 
FROM dbo.EmployeeInfo LEFT OUTER JOIN dbo.LeaveApplications ON 
      dbo.EmployeeInfo.id = dbo.LeaveApplications.EmployeeID 
WHERE (YEAR(dbo.LeaveApplications.ApplicationDate) = YEAR(GETDATE())) 
     OR dbo.LeaveApplications.ApplicationDate IS NULL 
GROUP BY dbo.EmployeeInfo.id, dbo.EmployeeMaster.EmpNo 
ORDER BY DaysTaken DESC