구간별 기간 합치기 0 3 2,008

by gopdan [Oracle 기초] [2023.06.08 14:02:03]


오라클 11g 에요

근무기간이 

A부서에서 20200101~20211231

A부서에서 20220101~20220930

B부서에서 20221001~20221231

A부서에서 20230101~20230608

이런식으로 데이터가 쌓여있는데 

같은부서에서 연속 근무한 경우에는 해당구간을 아래처럼 합하고 싶은데

A부서 20200101~20220930

B부서 20221001~20221231

A부서 20230101~20230608

주욱 같은부서인데도 근무이력이 여러번 쪼개진 경우가 있어서 이걸 합치는데 어려워서 문의드려요

Select 사번 ,부서코드,근무시작일,근무종료일

From 근무이력 

이 데이터를 가지고 구간별로 근무기간을 합칠 수 있는 방법이 있을까요? 

 

by 랑에1 [2023.06.08 15:03:40]

http://www.gurubee.net/lecture/2194


by 마농 [2023.06.08 17:18:32]

위의 링크는 연속된 일자를 합치는 것입니다.
아래 링크는 연속된 기간를 합치는 것입니다.
http://gurubee.net/lecture/2855


by 마농 [2023.06.08 17:40:36]
WITH t AS
(
SELECT 1 empno, 'A부서' deptno, '20200101' sdt, '20211231' edt FROM dual
UNION ALL SELECT 1, 'A부서', '20220101', '20220930' FROM dual
UNION ALL SELECT 1, 'B부서', '20221001', '20221231' FROM dual
UNION ALL SELECT 1, 'A부서', '20230101', '20230608' FROM dual
)
SELECT empno
     , deptno
     , MIN(sdt) sdt
     , MAX(edt) edt
  FROM (SELECT empno, deptno, sdt, edt
             , SUM(flag) OVER(PARTITION BY empno, deptno ORDER BY sdt) grp
          FROM (SELECT empno, deptno, sdt, edt
                     , DECODE( LAG(edt) OVER(PARTITION BY empno, deptno ORDER BY sdt)
                             , TO_CHAR(TO_DATE(sdt, 'yyyymmdd') - 1, 'yyyymmdd')
                             , 0, 1) flag
                  FROM t
                )
        )
 GROUP BY empno, deptno, grp
 ORDER BY empno, sdt
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입