2016-11-01 19 views
0

従業員がemployee_timeなどと呼ばれるテーブルに保存されたタイムカードに入力された時間がないことを報告する必要があります。存在しないIDに基づいてレコードを検索する

私の問題は、上記の週に時間を入力していない人を見つけることです。

私は、テーブルに存在しない従業員IDを見つけるためにNOT INを使用しました。したがって、レコードが存在しない場合、時間は入力されません。これはうまくいく。

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に有効なエントリを持っていないすべての従業員を検索します:

あなたはこれらの2つのクエリの「結婚」から欲しいん実際どのような出力
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に有効なエントリを持たない従業員を探しています。これは、もちろん、テーブルにレコードがない従業員にも当てはまります。あなたはクエリを試したことがありますか? –

関連する問題