0

次の契約テーブル レコードがあるとします。

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=3無効Id=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.

何か案が ?

4

2 に答える 2

1

私の理解が正しければ、StartDate が前のEndDate よりも大きくないレコードが必要ですか? 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
于 2013-07-25T07:50:24.110 に答える
0

あなたは試すことができます:

SELECT a.Id, a.EmpId
FROM Contracts a
WHERE a.StartDate > a.EndDate
GROUP BY a.Id, a.EmpId
于 2013-07-25T07:46:43.833 に答える