2014-07-18 2 views
0
내가 제대로 작동하려면 다음 쿼리를 얻는 데 문제가 있어요

:SQL Server 2008 Express에 쿼리

SELECT 
    tblEmployees.iEmployeeNum AS ID, tblEmployees.tLastName AS SURNAME, tblEmployees.tFirstName AS NAME, 
    pInt.dtEventReal AS 'ENTRANCE', pIes.dtEventReal AS 'EXIT' 
FROM 
    tblEmployees 
LEFT JOIN 
    (SELECT DISTINCT 
     dtEventReal,idEmpNum 
    FROM 
     tblEvents 
    WHERE 
     tDesc LIKE '%Entrance%' 
     AND CAST(tblEvents.dtEventReal AS DATE) BETWEEN CAST('2014-07-07' AS DATE) AND CAST('2014-07-08' AS DATE) 
    ) AS pInt ON pInt.idEmpNum = tblEmployees.iEmployeeNum 
LEFT JOIN 
    (SELECT DISTINCT 
     dtEventReal, idEmpNum 
    FROM 
     tblEvents 
    WHERE 
     tDesc LIKE '%Exit%' 
     AND CAST(tblEvents.dtEventReal AS DATE) BETWEEN CAST('2014-07-07' AS DATE) AND CAST('2014-07-08' AS DATE) 
    ) AS pIes ON pIes.idEmpNum = tblEmployees.iEmployeeNum 
WHERE 
    iEmployeeNum = 265 
    AND (CAST(pInt.dtEventReal AS DATE) = CAST(pIes.dtEventReal AS DATE) 
     OR (DATEPART(hh, pInt.dtEventReal) >= 18 
      AND CAST(pInt.dtEventReal AS DATE date) = CAST(pIes.dtEventReal-1 AS DATE))) 

내가 얻는 결과는 다음과 같습니다

ID SURNAME NAME  ENTRANCE     EXIT 
265 LAST FIRST 2014-07-07 07:56:08.000 2014-07-07 10:21:34.000 
265 LAST FIRST 2014-07-07 15:12:17.000 2014-07-07 10:21:34.000 
265 LAST FIRST 2014-07-07 07:56:08.000 2014-07-07 16:47:31.000 
265 LAST FIRST 2014-07-07 15:12:17.000 2014-07-07 16:47:31.000 
265 LAST FIRST 2014-07-08 07:56:34.000 2014-07-08 10:05:39.000 
265 LAST FIRST 2014-07-08 14:32:53.000 2014-07-08 10:05:39.000 
265 LAST FIRST 2014-07-08 07:56:34.000 2014-07-08 16:46:35.000 
265 LAST FIRST 2014-07-08 14:32:53.000 2014-07-08 16:46:35.000 

내가 무엇을 찾고 있어요 것은 :

ID NAME SURNAME  ENTRANCE     EXIT 
265 LAST FIRST 2014-07-07 07:56:08.000 2014-07-07 10:21:34.000 
265 LAST FIRST 2014-07-07 15:12:17.000 2014-07-07 16:47:31.000 
265 LAST FIRST 2014-07-08 07:56:34.000 2014-07-08 10:05:39.000 
265 LAST FIRST 2014-07-08 14:32:53.000 2014-07-08 16:46:35.000 

LE 1 - 마지막 상태가 있습니다.

OR 
(datepart(hh,pInt.dtEventReal)>=18 and cast(pInt.dtEventReal as date)=cast(pIes.dtEventReal-1 as date))) 

우리는 야간 근무를하고 다음날 끝내기 때문에 사람들이 있기 때문에.

L.E. - 2

이벤트는 컨트롤러에서 이벤트를 가져옵니다 소프트웨어에 의해 자동으로 데이터베이스에 추가되고 있습니다 :

IdAutoEvents tDesc   dtEventReal   tLastName tFirstName iEmployeeNum 
    312503 Main_Entrance 2014-07-18 07:24:33.000 SURNAME NAME   265 
    312742 Main_Exit 2014-07-18 10:31:23.000 SURNAME NAME   265 

LE 3 - mxix 답변에 따라 최종 버전 :

SELECT 
    E.iEmployeeNum ID, 
    E.tLastName SURNAME, 
    E.tFirstName NAME, 
    pInt.dtEventReal AS 'ENTRANCE', 
    pIes.dtEventReal AS 'EXIT', 
    pInt.tDesc AS 'Entrance Location', 
    pIes.tDesc AS 'Exit Location' 
FROM tblEmployees E 
LEFT JOIN (
    SELECT 
     DISTINCT 
     dtEventReal, 
     idEmpNum, 
       tDesc 
    FROM tblEvents 
    WHERE 
     tDesc LIKE '%Entrance%' AND 
     CONVERT(DATE,tblEvents.dtEventReal) BETWEEN cast('2014-07-07' as date) AND cast('2014-07-12' as date) 
) pInt ON 
    pInt.idEmpNum = E.iEmployeeNum 
OUTER APPLY(
    SELECT 
     TOP 1 
     dtEventReal, 
     idEmpNum, 
       tDesc 
    FROM tblEvents Ev 
    WHERE 
     tDesc LIKE '%Exit%' AND 
     Ev.idEmpNum = pInt.idEmpNum and 
     pInt.dtEventReal < Ev.dtEventReal 
    ORDER BY 
     dtEventReal ASC 
    ) AS pIes 
WHERE 
     E.IdDepartment in (2,11) 
     ORDER BY E.tLastName ASC, E.tFirstName, pInt.dtEventReal 
+0

죄송합니다. 몇 줄을 잘못 읽었습니다. 미안합니다. 당신이 찾고있는 패턴을 설명해 주시겠습니까? 첫 번째 결과 세트에서 두 번째 결과 세트를 얻으려면 어떻게해야합니까? –

+0

좀 더 자세한 정보를 추가했습니다 – Chris19

답변

1

한번 사용해보십시오

DECLARE 
    @start DATE = '2014-07-07', 
    @end DATE = '2014-07-07', 
    @user_id int = 265; 

SELECT 
    E.iEmployeeNum ID, 
    E.tLastName SURNAME, 
    E.tFirstName NAME, 
    pInt.dtEventReal AS 'ENTRANCE', 
    pIes.dtEventReal AS 'EXIT' 
FROM tblEmployees E 
LEFT JOIN (
    SELECT 
     DISTINCT 
     dtEventReal, 
     idEmpNum 
    FROM tblEvents 
    WHERE 
     tDesc LIKE '%Entrance%' AND 
     CONVERT(DATE,tblEvents.dtEventReal) BETWEEN @start AND @end 
) pInt ON 
    pInt.idEmpNum = E.iEmployeeNum 
OUTER APPLY(
    SELECT 
     TOP 1 
     dtEventReal, 
     idEmpNum 
    FROM tblEvents Ev 
    WHERE 
     tDesc LIKE '%Exit%' AND 
     Ev.idEmpNum = pInt.idEmpNum and 
     pInt.dtEventReal > Ev.dtEventReal 
    ORDER BY 
     dt_EventReal ASC 
    ) AS pIes 
WHERE 
    E.iEmployeeNum = @user_id 
+0

몇 가지 수정 사항을 통해 매력처럼 작동했습니다. 최종 버전 아래에 게시했습니다. 어떤 이유로 든 작동하지 않는다고 선언 했으므로 시작일과 종료일에 다시 전송하도록 전환했습니다. 또한, 오타가 발생했습니다. pInt.dtEventReal> Ev.dtEventReal은 pInt.dtEventReal Chris19

+0

내 질문에 답하는 대신 초기 질문에 최종 버전을 추가했습니다. – Chris19