2017-09-13 13 views
2

私はこれを理解しようとしている私の髪を引っ張っています。私は2つの別々の列(もともと同じ列にある)にINとOut StatusとDatetimeを表示するクエリを持っています。クエリは必要な方法で結果を返しますが、OUT日付が正しく表示されません。各IDには複数の入出力ステータスと時間があります。私は最後の24時間以内に最新の入退室時間が必要です。クエリはIn時刻を正しく返しますが、多くのOut時刻にはIn時刻より前の日付が表示されます。だから私が見なければならないのは、過去24時間以内のOUT時間と、ユーザーがチェックアウトしていない場合は空白にする必要があるということです。誰かがこれで私を助けてくれますか?以下のコードを参照してください。ステータスが最新の日付を表示

SELECT t1.ID, t1.FNAME, t1.InOut_Status AS Status_In, t1.Datetime AS 
Datetime_IN, t2.InOut_Status AS Status_Out, t2.Datetime As Datetime_OUT 
FROM table t1 
LEFT JOIN table t2 
    ON t1.id = t2.id 
    AND t2.InOut_Status = 'OUT' AND t1.Datetime >= DATEADD(hour, -24,GETDATE()) 
WHERE t1.InOut_Status = 'IN' 
+0

[この](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-をお読みくださいあなたの質問を改善するためのいくつかのヒントについては、パブリックフォーラムに参加してください)。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO

答えて

3

派生テーブルでこれを行うことができます。

... 
LEFT JOIN 
    (select t.id, max(t.Datetime) dt 
    from table t 
    group by t.id 
    where t.InOut_Status = 'OUT' 
    AND t.Datetime >= DATEADD(hour, -24,GETDATE())) t2 on t2.id = t1.id 
2

多分ちょうど条件付き集約を使用

SELECT ID, 
     FNAME, 
     MAX(CASE 
       WHEN InOut_Status = 'IN' 
       THEN Datetime 
      END) AS Datetime_IN, 
     MAX(CASE 
       WHEN InOut_Status = 'OUT' 
       THEN Datetime 
      END) AS Datetime_OUT 
FROM [Table] 
WHERE Datetime >= DATEADD(hour, -24, GETDATE()) 
GROUP BY ID, 
     FNAME 
関連する問題