2013-07-31 5 views
0

내가 가진이 내가 용액에 루프 구멍을 발견 SQLFIDDLE다른 날짜로하지만 같은 속성을 가진 두 개의 행을 병합

USER_NAME| ENTRY_DATE | TIMEIN | TIMEOUT 
User1 | 28-JUL-13  | 16:40:40 | 16:42:30 
User2 | 28-JUL-13  | 16:41:13 | 16:41:15 

하지만 출력을입니다

SELECT te.user_name, LEFT(te.entry_datetime, 10) AS entry_date, cin.entry_datetime AS timein, cout.entry_datetime AS timeout 
FROM time_entries te 
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MIN(entry_datetime) AS entry_datetime 
    FROM time_entries 
    WHERE entry_type = 'Time In' 
    GROUP BY user_name, entry_date 
) cin ON cin.user_name = te.user_name AND cin.entry_date = LEFT(te.entry_datetime, 10) 
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MAX(entry_datetime) AS entry_datetime 
    FROM time_entries 
    WHERE entry_type = 'Time Out' 
    GROUP BY user_name, entry_date 
) cout ON cout.user_name = te.user_name AND cout.entry_date = LEFT(te.entry_datetime, 10) 
GROUP BY te.user_name, entry_date; 

이 쿼리, 자신의 일부 다음날 밤새 근무하고 시간 초과 근무를하는 직원. 따라서 사용자가 2013 년 7 월 28 일에 시간 제한을 설정하고 2013 년 7 월 29 일에 시간 제한을 설정하면이 값이 출력됩니다. SQLFIDDLE

USER_NAME| ENTRY_DATE | TIMEIN | TIMEOUT 
User1 | 28-JUL-13  | 16:40:40 | null 
User1 | 29-JUL-13  | null  | 16:42:30 
User2 | 28-JUL-13  | 16:41:13 | 16:41:15 

논리가 맞다하지만 내 경우에는 appriate없는 것 같다. 난 그냥 작업을 쉽게 ENTRY_DATE 제거하고 단지 3 열 USER_NAME, TIMEIN 및 TIMEOUT을 가지고 생각하고있어. 이 같은.

USER_NAME | TIMEIN    | TIMEOUT 
User1  | 28-JUL-13 16:40:40 | 29-JUL-13 16:42:30 
User2  | 28-JUL-13 16:41:13 | 28-JUL-13 16:41:15 

변경 사항이나 새로운 솔루션을 제안 할 사람이 있습니까? 감사.

답변

0

마지막으로 나는 내 자신의 문제를 해결할 수있었습니다.

USER_NAME| DATE  | TIMEIN    | TIMEOUT 
User1 | 28-JUL-13 | 28-JUL-13 16:40:40 | 29-JUL-13 16:42:30 
User2 | 29-JUL-13 | 29-JUL-13 16:43:16 | null 
User1 | 30-JUL-13 | 30-JUL-13 16:47:16 | 31-JUL-13 16:50:32 

가 BTW 나는 또한 유용하다고 때문에 더 이상 날짜를 제거하지 않기로 결정 : 여기가 초보자 SQLFIDDLE

SELECT te.user_name, date(te.entry_datetime) as date, te3.entry_datetime as Timein, te2.entry_datetime as Timeout 
FROM time_entries te 

JOIN time_entries te3 ON te.user_name = te3.user_name 
AND te3.entry_type='Time In' AND te3.entry_datetime = 
    (SELECT entry_datetime 
    FROM time_entries 
    WHERE entry_type='Time In' AND user_name=te.user_name AND entry_datetime = te.entry_datetime 
    GROUP By entry_datetime) 

LEFT JOIN time_entries te2 ON te.user_name = te2.user_name 
AND te2.entry_type='Time Out' AND te2.entry_datetime = 
    (SELECT entry_datetime 
    FROM time_entries 
    WHERE entry_type='Time Out' AND user_name=te.user_name AND entry_datetime > te.entry_datetime 
    ORDER BY 
    ABS(TIMESTAMPDIFF(SECOND, te.entry_datetime, 'entry_datetime')) 
    LIMIT 1) 

샘플 출력으로 볼 수있는 솔루션입니다.

참고 : 이것은 SQL에있는 NEWBIE로 할 수있는 최선의 방법이나 최선의 설계 또는 아키텍처가 아닐 수 있습니다. 더 나은 해결책이 있다면이 정보를 공유하고 주위를 골라야하지 마십시오. :)

+0

이 방법이 효과가있을 수 있지만 디자인보다는 운이 그렇게 두려워요. 해결책으로 사용해서는 안됩니다. – Strawberry

+0

글쎄, 내가 이해하기 때문에 나는 단지 SQL의 초보자입니다. 나는 방금 배우기 시작했으며 아직 잘 디자인되지 않았습니다. 하지만 그 사실을 시도하고 그것을하기 위해 최선을 다했고 다른 사람들의 대답에 의존하지 않았습니다. 이것이 최선의 해결책이 아닐 수도 있지만 그것이 내 요구를 충족시키기 때문에 좋습니다. 오히려 좋은 디자인으로 답을 얻기를 기다리는 것보다. – bot

+0

어, 어쨌든 ... – Strawberry

관련 문제