2016-10-06 2 views
1

私は複数の従業員のためにクロック・イン/アウトの時間を保持するテーブルを持っている:mssql - 同じ行に列の値を表示するには、内部結合を使用しますか?

username   datetime     action 

test.user   2016-10-05 07:30:49  0 
test.user   2016-10-05 08:50:00  1 
test.user   2016-10-05 08:53:49  0 
test.user   2016-10-05 13:35:47  1  

は、私は、ユーザー名を含む行ごとに結果セットを取得すると、そのユーザ名のイン/アウトの操作で時計のペア(0はクロックイン、1はクロックアウト)。

私はこれまで持っていることはこれです:

select a.username, a.datetime as clockIN, b.datetime as clockOUT 
from attendance a 
inner join 
attendance b 
on 
(
a.username = b.username 
and datepart(dd, a.datetime) = datepart(dd, b.datetime) 
and datepart(mm, a.datetime) = datepart(mm, b.datetime) 
and datepart(yy, a.datetime) = datepart(yy, b.datetime) 
and a.action = 0 
and b.action = 1 
and a.datetime < b.datetime 
) 
order by a.datetime asc 

そして、これが

username  clockIN    clockOUT 

test.user  2016-10-05 07:30:00 2016-10-05 08:50:00 
test.user  2016-10-05 07:30:00 2016-10-05 13:35:47  
test.user  2016-10-05 08:53:49 2016-10-05 13:35:47 

望ましい結果は以下のようになり、結果です:

username  clockIN    clockOUT 

test.user  2016-10-05 07:30:00 2016-10-05 08:50:00 
test.user  2016-10-05 08:53:49 2016-10-05 13:35:47 

OMMITする方法上の任意のアイデア結果から2番目の行?

ありがとうございます!

+0

番目のレコードが省略されていることにより、ロジックとは何ですか? –

+1

2つのクロック出力の値が同じで、clockIN値が異なる場合はどうなりますか? – jarlh

+1

私は混乱しています...ユーザーは同時に2回チェックインし、異なる時間にチェックアウトしますか?または、ユーザーを分けていますか? – Danieboy

答えて

0

方法について:

SELECT 
    a1.username, a1.datetime as clockIN 
, (SELECT top 1 a2.datetime FROM #attendance a2 
    where a1.username = a2.username and a2.action = 1 and a2.datetime > a1.datetime order by a2.datetime) AS clockout 
FROM #attendance a1 WHERE action = 0 
+0

ですので、2行目は無効です。よく働く! – Andreas

関連する問題