쿼리 행을 열로 하는 질문입니다. 0 3 1,289

by 2016년신입 [SQL Query] [2017.07.05 11:40:03]


       사번    이름    발령순차    발령일자    발령명    발령코드
1    1234    홍길동    1            20170101    복직         01
2    1234    홍길동    2            20170101    무급휴직    02
3    1234    홍길동    6            20170501    복직          01
4    5678    김민수    7            20170901    무급휴직    02
5    5678    김민수    8            20171101    복직          01
6    3456    이철수    10          20170101    유급휴직    03
 

이렇게 되어있는 쿼리를 아래와 변경하고 싶습니다.

동일한 사원의 발령이 더 있을 경우 3차, 4차 이런식으로 증가가 되며

복직인 경우에는 종료로, 휴직인 경우에는 시작으로 하되 날짜순차로 해서 출력을 하고 싶습니다.

이게 혹시 가능한건가요?

사번 이름 1차시작 1차종료 1차시작발령 1차종료발령 2차시작 2차종료 2차시작발령 2차종료발령
1234 홍길동   20170101   복직 20170101 20170501 무급휴직 복직
5687 김민수 20170901 20171101 무급휴직 복직        
3456 이철수 20170101   유급휴직          

 

쿼리 데이터는 아래제공해드립니다.  


WITH TEMP AS
(
SELECT '1234' 사번, '홍길동' 이름, '1' 발령순차, '20170101' 발령일자, '복직' 발령명, '01' 발령코드 FROM dual UNION ALL
SELECT '1234',    '홍길동',    '2',    '20170101',    '무급휴직', '02' FROM dual UNION ALL
SELECT '1234',    '홍길동',    '6',    '20170501',    '복직', '01' FROM dual UNION ALL
SELECT '5678',    '김민수',    '7',    '20170901',    '무급휴직', '02' FROM dual UNION ALL
SELECT '5678',    '김민수',    '8',    '20171101',     '복직', '01' FROM dual UNION ALL
SELECT '3456',    '이철수',    '10',    '20170101',    '유급휴직', '03' FROM dual  

SELECT * from temp

by jkson [2017.07.05 12:57:44]

종료는 항상 복직(01)과 매칭되고 그 이외의 코드는 모두 시작과 매칭되는 건가요? 3차, 4차 발령이 생길 수는 없는지..


by 2016년신입 [2017.07.05 12:59:38]

네 종료는 항상 복직(01)과 매칭되고, 3차, 4차 발령이 존재할수 있어요, 생긴다면 옆으로 추가가 되구요. 


by 마농 [2017.07.05 15:34:15]
WITH temp AS
(
SELECT '1234' 사번, '홍길동' 이름, 1 발령순차, '20170101' 발령일자, '복직' 발령명, '01' 발령코드 FROM dual
UNION ALL SELECT '1234', '홍길동',  2, '20170101', '무급휴직', '02' FROM dual 
UNION ALL SELECT '1234', '홍길동',  6, '20170501', '복직'    , '01' FROM dual 
UNION ALL SELECT '5678', '김민수',  7, '20170901', '무급휴직', '02' FROM dual 
UNION ALL SELECT '5678', '김민수',  8, '20171101', '복직'    , '01' FROM dual 
UNION ALL SELECT '3456', '이철수', 10, '20170101', '유급휴직', '03' FROM dual  
) 
SELECT *
  FROM (SELECT 사번, 이름
             , ROW_NUMBER() OVER(PARTITION BY 사번 ORDER BY grp) 차
             , MIN(DECODE(발령코드, '01', '', 발령일자)) 시작일자
             , MIN(DECODE(발령코드, '01', 발령일자, '')) 종료일자
             , MIN(DECODE(발령코드, '01', '', 발령명  )) 시작발령
             , MIN(DECODE(발령코드, '01', 발령명  , '')) 종료발령
          FROM (SELECT 사번, 이름, 발령순차, 발령일자, 발령명, 발령코드
                     , SUM(DECODE(발령코드, '01', 0, 1)) OVER(
                       PARTITION BY 사번 ORDER BY 발령일자, 발령순차) grp
                  FROM temp
                )
         GROUP BY 사번, 이름, grp
        )
 PIVOT ( MIN(시작일자) 시작일자
       , MIN(종료일자) 종료일자
       , MIN(시작발령) 시작발령
       , MIN(종료발령) 종료발령
         FOR 차 IN ( 1 "1차"
                   , 2 "2차"
                   , 3 "3차"
                   , 4 "4차"
                   )
       )
;

 

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