2009-07-22 1 views
0

私は、EmployeeId、LeaveReason、Dateの3つのカラムを持つEmployeeAbsenceというテーブルを持っています。この表は、従業員の出席を毎日記録しています。私は過去14日間に離職した従業員のリストを知りたい。この場合指定されたデータ範囲に対して存在するタプルのセットを返すSQLクエリ

例えば、

1 XYZ 2009-07-20 
2 XYZ 2009-07-19 
-- 
--- 
-- 
1001 XYZ 2009-07-04 

それが連続して過去14日間欠席した従業員のためのエントリが含まれているので、私のクエリ出力は、XYZと同様に返す必要があります。私はORACLEクエリを感謝します。

+0

「日付」列の意味は?それは欠席の開始日ですか?あるいは、従業員が不在だった毎日の記録がありますか?そして、過去14日間に3つの異なる理由で3回休暇を取った従業員のために取得する行の数はいくつですか? – jva

答えて

1

あなたのクエリは休暇の2つの制約

  1. データは、14日未満離れて、現在の日付からでなければなりません
  2. 従業員は、彼らが中に数日間/回休職にされている場合は1度だけ表示している必要があります。 14日の期間

制約(1)の場合、日付Bから日付Aを引くと、その2つの日付の間の日数が計算されることが必要です。

制約(2)の場合、従業員IDでグループ化する必要があります。

SELECT EmployeeID 
FROM EmployeeAbsence 
WHERE Date between SYSDATE - 14 and SYSDATE 
GROUP BY EmployeeId 

はトリックを行うべきであると述べた

0

私は、テーブルには休日ごとに1レコードがあり、あなたは不在だった従業員を検索したくないと仮定します。先月14日に戻った。

SELECT employeeId 
FROM employeeAbsences base 
WHERE date > trunc(sysdate)-15 -- we want to include one more day for HAVING clause to work with 
GROUP BY employeeId 
-- had 2 or more non-consecutive leaves --> at least one of them started during last 14 days 
HAVING count(*) < max(date) - min(date) 
    -- first absence is less than 14 days ago 
    OR min(date) > trunc(sysdate) - 14;