2014-10-18 2 views
1

출석 기계에서 가져온 출근 로그에서 근무 시간을 계산하는 프로젝트가 있습니다. SQLite 데이터베이스와 VB .NET을 사용합니다.일치하는 행이없는 시간 동안 출석 목록 생성

CREATE TABLE [CheckLogs] (
[IDCheckLog] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
[IDEmployee] TEXT NOT NULL, 
[Dates] TEXT NOT NULL, 
[In] TEXT, 
[Out] TEXT, 
[OverTime] NUMERIC DEFAULT 0); 

CREATE TABLE integers (i INTEGER NOT NULL PRIMARY KEY); 
INSERT INTO integers (i) VALUES 
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9); 

표 CheckLogs 내가 출석 시스템에서 가져 오는 데이터입니다 :

먼저 나는 내가 사용하는 테이블을 보여 드리겠습니다. OverTime 열은 내 프로그램에서 계산됩니다. 테이블 정수는 날짜 목록을 만드는 데 사용됩니다. here에서 가져 왔습니다.

두 날짜 사이에 직원 출석을 표시하는보기를 생성하고 직원이있는 경우 CheckLogs 데이터를 표시하고 부재중 인 경우 null을 표시하려고합니다. CheckLogs 테이블에서 직원이 부재 한 경우이 직원의 해당 날짜의 데이터가 없기 때문입니다.

내가 원하는이다 (이 2014년 10월 1일와 2014년 10월 5일 사이에 직원 10001에 대한 보고서입니다) :

Dates  | IDEmployee | In | Out 
--------------------------------------- 
2014-10-01 | 10001  | 07:00 | 16:00 
2014-10-02 | 10001  | 07:01 | 15:58 
2014-10-03 | 10001  | null | null 
2014-10-04 | 10001  | 07:08 | 15:48 
2014-10-05 | 10001  | null | null 

그리고 이것은 내가 지금 가지고있는 쿼리입니다 :

이 쿼리에서
SELECT X.[Dates], C.[IDEmployee], C.[In], C.[Out] 
FROM 
(select date('2014-10-01', '+' || (H.i*100 + T.i*10 + U.i) || ' day') as Dates 
    from integers as H 
cross 
    join integers as T 
cross 
    join integers as U 
    where date('2005-01-25', '+' || (H.i*100 + T.i*10 + U.i) || ' day') <= '2014-10-05') AS X 
    , CheckLogs AS C USING (Dates) 
    WHERE C.[IDEmployee]='10001' 

나는이 결과가 있습니다

Dates  | IDEmployee | In | Out 
--------------------------------------- 
2014-10-01 | 10001  | 07:00 | 16:00 
2014-10-02 | 10001  | 07:01 | 15:58 
2014-10-04 | 10001  | 07:08 | 15:48 

답변

0

이 일치하지 않고 행에 대한 NULL 값을 얻으려면을, 당신은 필요 outer join. 그리고 NULL 값과 일치하지 않는 WHERE 절을 사용하여 행을 필터링하지 않도록주의해야합니다. 조건과 일치하지 않는 날짜를 얻기 위해, 당신은 절에서 JOIN의에 해당 조건을 추가해야한다

SELECT ... 
FROM (...) AS X 
LEFT JOIN CheckLogs AS C ON C.Dates = X.Dates AND 
          C.IDEmployee = '10001' 
+0

내가, 내가 잘못된 쿼리를 유감 붙여있어, 내가 올바른 쿼리를 업데이트했습니다. 이미 LEFT JOIN을 사용하고 있지만 결과에 NULL 값이 없습니다. 감사합니다 – Andy

+0

CL, WHERE 절이 내 문제의 원인입니다. 감사합니다. – Andy

+0

불행히도 여전히 문제가 있습니다. 다른 직원과 일치하는 항목이 있으면 해당 날짜의 값이 표시되지 않습니다. 예를 들어 2014-10-03에 IDEmployee 10002가 없으면 IDEmployee 10001에 대한 쿼리에 2014-10-03 행이 없습니다. – Andy