2013-10-12 5 views
1

나는 시작일과 종료일이있는 직원 목록을 가지고 있습니다. 관리자가 변경 될 때마다 새로운 라인이 생성됩니다. 나는 일년 내내 매달 자신의 부서가 무엇인지 알아 내려고 노력하고 있습니다.MySQL을 월별로 월별로 나누는 범위

EMP_ID startdate enddate  staffgroup 
494694 2012-05-24 2013-01-09 Service 
494694 2013-01-09 2013-02-03 Service 
494694 2013-02-03 2013-02-04 Service 
494694 2013-02-04 2013-02-05 Service 
494694 2013-02-05 2013-02-07 Service 
494694 2013-02-07 2013-02-15 Service 
494694 2013-02-15 2013-03-20 Service 
494694 2013-03-20 2013-06-01 Service 
494694 2013-06-01 2013-06-03 Manager 
494694 2013-06-03 2013-07-01 Manager 
494694 2013-07-01 2099-12-31 Manager 

예상 결과

EMP_ID Month  staffgroup 
494694 2013-01-01 Service 
494694 2013-02-01 Service 
494694 2013-03-01 Service 
494694 2013-04-01 Service 
494694 2013-05-01 Service 
494694 2013-06-01 Manager 
494694 2013-07-01 Manager 
+0

GROUP BY MONTH (startdate)를 찾으십니까? – Mihai

+0

아니요, 범위에서 달을 추출하려고합니다. 예를 들어 첫 번째 행의 날짜 범위는 2012-05-24에서 2013-01-09입니다. 매월 그 범위에서 추출하고 싶습니다. –

+1

그런 다음 원하는 결과에 2012 년 행이없는 이유는 무엇입니까? – fancyPants

답변

1

DATE_HELPER을 만들기 위해 당신에게 '201310'을 줄 것이다 여기

는 데이터의 테이블 포함 원하는 월 내내 :

the_date 
2013-01-01 
2013-02-01 
... 
2013-12-01 

그러면 매월 초 이전에 그 사람이 가진 마지막 직원 그룹이 필요합니다.

  SELECT e.EMP_ID, max(e.startdate), dh.the_date 
      FROM DATE_HELPER dh 
LEFT OUTER JOIN RAW_EMP_DATA e on (e.startdate <= dh.the_date) 
     GROUP BY EMP_ID, dh.the_date 

Results: 
EMP_ID startdate the_date 
494694 2012-05-24 2013-01-01 
494694 2013-01-09 2013-02-01 
494694 2013-02-15 2013-03-01 
494694 2013-03-20 2013-04-01 
494694 2013-03-20 2013-05-01 
494694 2013-06-01 2013-06-01 
494694 2013-07-01 2013-07-01 
494694 2013-07-01 2013-08-01 
494694 2013-07-01 2013-09-01 
494694 2013-07-01 2013-10-01 

이렇게하면 관련된 모든 시작일을 알 수 있습니다. 따라서 원래 테이블에 다시 가입하여 staffgroup을 얻으십시오.

SELECT red.EMP_ID, X.the_date as Month, red.staffgroup 
     FROM RAW_EMP_DATA red 
INNER JOIN (
     SELECT e.EMP_ID, max(e.startdate), dh.the_date 
      FROM DATE_HELPER dh 
LEFT OUTER JOIN RAW_EMP_DATA e on (e.startdate <= dh.the_date) 
     GROUP BY EMP_ID, dh.the_date 
      ) X on (X.EMP_ID = red.EMP_ID and X.startdate = red.startdate) 

Results: 
EMP_ID Month  staffgroup 
494694 2013-01-01 Service 
494694 2013-02-01 Service 
494694 2013-03-01 Service 
494694 2013-04-01 Service 
494694 2013-05-01 Service 
494694 2013-06-01 Manager 
494694 2013-07-01 Manager 
494694 2013-08-01 Manager 
494694 2013-09-01 Manager 
494694 2013-10-01 Manager 
+0

아주 좋습니다. 그것이 연구의 하루 후에 Google에서 찾은 정확한 해결책입니다. 나는 당신이 당신의 포스트에서 말했던 것처럼 거의 똑같이했다. 나는 2013 년 달력으로 테이블을 만들었습니다. 2 주 전에 당신이 대답했으면 좋겠어요. –

+0

어쨌든 도움이 되었기 때문에 기쁩니다. 아마도 다음에 도움을 청할 시간에 도움을 얻을 것입니다. – mdahlman

0

뭔가 같은 :

SELECT EXTRACT(YEAR_MONTH FROM startdate) 

FROM `employee` 

2013 년 10 월

+0

그렇다면 범위 사이에 날짜를 어떻게 얻을 수 있습니까? –

관련 문제