0

出席システム用に次のデータベース スキーマがあります。

データベース スキーマ

X 日目のエントリの適切なレポートを生成するには、SQL クエリをどのように作成すればよいでしょうか? 次のレポートを生成するために必要です

従業員名 | タイムイン | タイムアウト
ボブ | 10:00 | 11:00
サム | 10:30 | 18:00
ボブ | 11:30 | 15:00

しかし、それがタイムインかアウトかを定義する行は、entryType (1 がイン、0 がアウト) によって設定されるため、TimeIn と TimeOut にエイリアスを設定します。

私の試みは

`SELECT firstName, time from log INNER JOIN users on log.employeeID = users.employeeID WHERE date = GETDATE()`

しかし、これは、ある時は入口であり、ある時は出口であるという事実を処理しません。

1 日につき複数のサインインが存在する可能性があることに注意してください。

アップデート:

別の試みですが、サブクエリは複数の行を返します

select firstName, (select time as timeIn from log where entryType = 1), (select time as timeOut from log where entryType = 0) inner join users on log.uID = users.uID from log group by uID 
4

3 に答える 3

1

これは Oracle で動作します (非 ANSI スタイルについては申し訳ありませんが、ドリフトを取得する必要があります)。

SELECT FORENAME,SURNAME,L1.TIME IN_TIME,L2.TIME OUT_TIME
FROM EMPLOYEES EMP, LOG L1, LOG L2
WHERE EMP.EMPLOYEE_ID = L1.EMPLOYEE_ID
AND EMP.EMPLOYEE_ID = L2.EMPLOYEE_ID
AND L1.ENTRYTYPE = 1
AND L2.ENTRYTYPE = 0
AND L2.TIME = (SELECT MIN(TIME) FROM LOG WHERE EMPLOYEE_ID = L2.EMPLOYEE_ID AND L2.ENTRYTYPE = 0 AND TIME > L1.TIME)

アップデート:

ああ、はい、それは考えていませんでした。この場合、外部結合が必要です。このようなもの(未テスト):

SELECT FORENAME,SURNAME,L1.TIME IN_TIME,L2.TIME OUT_TIME
FROM EMPLOYEES EMP
INNER JOIN LOG L1 ON EMP.EMPLOYEE_ID = L1.EMPLOYEE_ID AND L1.ENTRYTYPE = 1
LEFT OUTER JOIN LOG L2 ON EMP.EMPLOYEE_ID = L2.EMPLOYEE_ID AND L2.ENTRYTYPE = 0
                       AND L2.TIME = (SELECT MIN(TIME) FROM LOG WHERE EMPLOYEE_ID = L2.EMPLOYEE_ID AND L2.ENTRYTYPE = 0 AND TIME > L1.TIME)
于 2013-07-05T11:56:47.853 に答える
0

このクエリは、従業員の最も早い出社時間と最も遅い出勤時間を提供します。

 SELECT E.FORENAME, 
(SELECT MIN(TIME) FROM LOG WHERE EMPLOYEEID = E.EMPLOYEEID AND ENTRYTYPE = 1 AND DATE = <YOUR DAYE>) AS "TIME_IN", 
(SELECT MAX(TIME) FROM LOG WHERE EMPLOYEEID = E.EMPLOYEEID AND ENTRYTYPE = 0 AND DATE = <YOUR DAYE>) AS "TIME_OUT" 
FROM EMPLOYEE E WHERE E.EMPLOYEEID = <EMPLOYEE ID>
于 2013-07-05T08:54:03.410 に答える