2016-11-01 48 views
0

我需要向他們報告的員工沒有存儲在一個名爲employee_time等表中的考勤卡輸入的時間。查找記錄這不/的確存在

我的問題是要找到誰沒有進入時間說周的人。

我已經使用了NOT IN發現不存在於表中,因此,如果已經輸入記錄不存在任何時候員工ID。這很好。

Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd 

From employee_time et, 
     employee e 
Where 
     e.employee_id NOT IN (Select employee_id from employee_time 
          where et.dateStart = date and 
            et.end_date = date) 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 

的問題是應用程序,當一個人導航到員工的時間輸入頁面它創造紀錄的員工,如果員工不進入任何時間,結果是零小時的記錄。但是這個記錄現在存在。因此,不會在上面的查詢可以發現,我已經使用了以下查找其總計記錄= 0

Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd, 
    SUM(et.hoursTotal) AS total 

From employee_time et, 
     employee e 
Where 
     e.employee_id = et.employee_id and 
     et.hours_total = 0 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 

這也非常實用,但是我需要與他們結婚,但一直不成功的日期。你能幫我嗎?

+0

你在這兩個查詢的「聯姻」想什麼實際輸出? –

+0

你想用'hours_total' = 0來對待記錄,就好像它們不存在一樣? 'hours_total <> 0'? –

+0

我想要的輸出是employee_ids,所以我能夠訪問用戶名並將其放入報告中,表示沒有輸入時間。 – Bman

回答

0
Select 
    e.userName, 
    et.dateStart, 
    et.dateEnd, 
    SUM(et.hoursTotal) AS total 

From 
     employee e left outer join employee_time et on (e.employee_id = et.employee_id) 
-- Where nvl(et.hours_total,0) = 0 
Group by 
     e.userName, 
     et.startDate, 
     et.endDate 
having SUM(et.hoursTotal) > 0 

如果你不希望有您可以使用作了評論,這應該是相同的

,如果你只想要employee_ids:

select e.empolyee_id 
from employee e left outer join employee_time et on (e.employee_id = et.employee_id) 
Where nvl(et.hours_total,0) = 0; 
0

一般格式是這樣的:

Select employee_id 
    From employee 
Minus 
Select employee_id 
    From TableExpressionEliminatesOnMissingDates 
Minus 
Select employee_id 
    From TableExpressionEliminatesOnSummarization; 
0

我會爲這樣寫:

Select e.userName 
From employee e 
Where e.employee_id NOT IN (Select employee_id 
          from employee_time 
          where et.dateStart = $date and 
            et.end_date = $date and 
            et.hoursTotal > 0 
          ); 

您從開始的日期作爲輸入,所以我不明白爲什麼你需要它的輸出也是如此。如果你這樣做,我會去:

Select e.userName, w.* 
From employee e cross join 
    (select distinct et.dateStart, et.end_date 
     from employee_time et 
     where $date between et.dateStart and et.dateEnd 
    ) w 
Where e.employee_id NOT IN (Select et.employee_id 
          from employee_time et 
          where $date between et.dateStart and et.dateEnd and 
            et.hoursTotal > 0 
          ); 

注:在外部查詢。避免GROUP BY是在性能方面的勝利。

0

以下查詢發現,在employee_time對於給定的開始和結束日期沒有有效的條目中的所有員工:

select * 
from employee 
where employee_id not in 
(
    select employee_id 
    from employee_time 
    where datestart = :date_start 
    and end_date = :date_end 
    and hours_total > 0 
); 
+0

Thorsten,這是正確的,但我也需要那些從不訪問employee_time表的人員,因此他們沒有記錄。 – Bman

+0

查詢正在查找在給定時間範圍內employee_time中沒有有效條目的員工。對於當然沒有任何記錄的員工也是如此。你甚至嘗試過查詢嗎? –