9

私は名前の2つの派生テーブルはインをチェックして、SQL左(複数の条件に参加)に参加

は、私が欲しいイン

CheckDate CheckIn 
---------- --------- 
08/02/2011 10:10:03 
08/02/2011 15:57:16 
07/19/2011 13:58:52 
07/19/2011 16:50:55 
07/26/2011 15:11:24 
06/21/2011 12:36:47 
08/16/2011 14:49:36 
08/09/2011 13:52:10 
08/09/2011 16:54:51 
08/23/2011 15:48:58 
09/06/2011 15:23:00 
09/13/2011 10:09:27 
09/13/2011 10:40:14 
09/13/2011 11:43:14 
09/13/2011 11:59:32 
09/13/2011 17:05:24 
09/20/2011 11:03:42 
09/20/2011 12:08:50 
09/20/2011 15:21:06 
09/20/2011 15:34:29 
09/27/2011 11:34:06 
10/04/2011 11:37:59 
10/04/2011 15:24:04 
10/04/2011 16:57:44 
10/11/2011 18:19:33 

チェックアウト

CheckDate CheckOut 
---------- --------- 
08/02/2011 13:29:40 
08/02/2011 17:02:25 
07/12/2011 17:06:06 
07/19/2011 16:40:15 
07/19/2011 17:07:35 
07/26/2011 14:48:10 
07/26/2011 17:27:08 
05/31/2011 17:01:39 
06/07/2011 17:04:29 
06/14/2011 17:08:50 
06/21/2011 17:03:46 
06/28/2011 17:10:45 
07/05/2011 17:02:48 
08/16/2011 13:37:36 
08/16/2011 17:06:34 
08/09/2011 12:00:29 
08/09/2011 13:29:36 
08/09/2011 14:36:09 
08/09/2011 17:00:38 
08/23/2011 13:37:11 
08/23/2011 17:01:37 
09/06/2011 17:00:09 
09/13/2011 10:11:50 
09/13/2011 11:22:02 
09/13/2011 11:47:35 
09/13/2011 14:13:36 
09/13/2011 14:14:25 
09/13/2011 17:08:43 
09/20/2011 09:54:55 
09/20/2011 11:55:31 
09/20/2011 11:55:36 
09/20/2011 13:35:16 
09/20/2011 15:26:02 
09/20/2011 16:33:21 
09/20/2011 17:07:52 
09/27/2011 11:12:38 
10/04/2011 13:26:31 
10/04/2011 16:32:56 
10/04/2011 17:02:35 
10/11/2011 18:25:32 

をチェックアウトを確認してい両方のログが同じ日付にあり、チェックアウト値がbでないことを条件に、チェックインとチェックアウトを組み合わせるE以前のチェックインよりも、私は

CheckDate CheckIn CheckOut 
---------- --------- --------- 
06/21/2011 12:36:47 17:03:46 
07/19/2011 13:58:52 16:40:15 
07/26/2011 15:11:24 17:27:08 
08/02/2011 10:10:03 13:29:40 
08/09/2011 13:52:10 14:36:09 
08/16/2011 14:49:36 17:06:34 
08/23/2011 15:48:58 17:01:37 
09/06/2011 15:23:00 17:00:09 
09/13/2011 10:09:27 10:11:50 
09/20/2011 11:03:42 11:55:31 
10/04/2011 11:37:59 13:26:31 
10/11/2011 18:19:33 18:25:32 

の結果セットでは、このクエリ

SELECT A.ChkDt 
     AS CheckDate, 
     B.CheckIn, 
     MIN(A.ChkTm) 
     AS CheckOut 
    FROM #tempAttLogs 
     AS A LEFT JOIN 
     (SELECT ChkDt 
       AS CheckDate, 
       MIN(ChkTm) 
       AS CheckIn 
      FROM #tempAttLogs 
      WHERE ChkTp = 'I' 
     GROUP BY ChkDt) B 
     ON A.ChkDt = B.CheckDate 
    WHERE ChkTp = 'O' AND 
     A.ChkTm > B.CheckIn 
GROUP BY A.ChkDt, B.CheckIn 

が出ている事は、私はまた、該当するペアでログを含めたいです。どのようにこれを可能にすることができますか?

EDIT

私の予想される結果セットには、この

CheckDate CheckIn CheckOut 
---------- --------- --------- 
05/23/2011 NULL  17:04:27 
+0

論理に従おうとすると、「out = 2011-02-08T15:57:16」と「out = 2011-02-08T17:02:25」をペアにできますが、これは可能です結果セットには表示されません。すべき? * expected * resultsetを投稿した場合は役に立ちます。 – onedaywhen

+0

いつも同じ日にチェックアウトしてチェックインしていますか?チェックアウトが真夜中に近い場合、チェックインは翌日ですか? –

+0

別々の日付と時刻の代わりに日付時刻を使用すると、クエリが簡単になる場合があります。 –

答えて

8

WHEREの代わりにON句に右手のテーブルを入れて、JOINからINNER JOIN

などです。

ON A.ChkDt = B.CheckDate AND 
     A.ChkTm > B.CheckIn 
WHERE ChkTp = 'O' 

代わりの

ON A.ChkDt = B.CheckDate 
    WHERE ChkTp = 'O' AND 
     A.ChkTm > B.CheckIn 
+0

それは簡単だろうと思ったことはありません。ありがとう! – ELM

2

のようなログを含める必要がありますWHERE句例ではNULL値を含める:あなたは任意の述語参照を移動することができます

WHERE(ChkTp = 'O' AND 
     A.ChkTm > B.CheckIn) OR B.CheckDate IS NULL 
+0

あなたが 'A.ChkTm> = B.CheckInを望むかもしれないので、' JOIN ... ON A.ChkDt = B.CheckDate WHERE ... A.ChkTm> B.CheckIn'ちょっとOP質問にお互いをキャンセルしてください。 '代わりに – Seph

0

これは、あなたの質問に若干の接線であるにもかかわらず、あなたの問題を解決するために(テストしていません)便利かもしれません。

select 
    Checkdate, CheckIn as CheckTime, 'I' as CheckAction 
from CheckIns 

union all 

select 
    Checkdate, CheckOut as CheckTime, 'O' as CheckAction 
from CheckOuts 
order by 1,2