2013-07-25 24 views
0

給出下列合同表中的記錄sql中的問題

Id EmployeeId StartDate EndDate 
1 5601  2011-01-01 2011-09-01 
2 5601  2011-09-02 2012-05-01 
3 5601  2012-02-01 2012-08-01 
4 5602  2011-01-01 2011-09-01 
5 5602  2011-07-01 2012-10-01 

選擇查詢和組每個員工可以有多個合同

我試圖找到無效合同,StartDate是大於EndDate爲每個員工。

對於給定結果Id=3Id=5無效。 我做了什麼是:

SELECT a.Id 
FROM Contracts a 
GROUP BY a.EmpId 
HAVING a.StartDate > a.EndDate 

但我得到這個錯誤:

Column 'Contract.Id' is invalid in the HAVING clause because it is not contained in either an aggregate function or the group by clause. 

任何想法?

回答

1

如果我理解正確的,你想記錄,其中起始日期是更大然後以前結束日期? 您可以使用CTEROW_NUMBER()函數來執行此操作 - 參與前一個記錄和當前記錄。

WITH CTE AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY StartDate) RN 
    FROM Contracts 
) 
SELECT * FROM CTE c1 
INNER JOIN CTE c2 ON c1.RN + 1 = c2.RN AND c1.EmployeeID = c2.EmployeeID 
WHERE c1.EndDATE > c2.StartDate 
0

你可以試試:

​​
+0

它導致錯誤:因爲它不是在聚合函數或cluse – Mostafa

+0

@mostafa集團現載列「ContractId」在選擇列表中無效,我想這不會導致錯誤。 – Novice