SQL 4 Oracle 오라클용 sql 실무

SQL4Oracle

인사 근속기간 추출

돌프1 2023. 3. 10. 13:35

2011-08-02 14:10:41


SQL 4 Oracle 오라클용 sql 실무

▒ 인사 근속기간 추출

 

최근 3년 퇴직자 중 총 근속기간이 1년 이상인 자
단, 중도에 입퇴사 반복된 자는 공백기간이 1개월 미만인 경우 계약기간이 연속된 것으로 계산하고,
공백기간이 1개월 이상인 경우 각각 1인으로 추출

----------------------------------------------------------------

select *
from
(       
 select  이름, 주민번호, CMY 입사일, RTR 퇴사일,
         trunc(months_between( to_date( RTR,'yyyymmdd') , to_date(CMY,'yyyymmdd') ))+1 근속월
 from (
                                
           select 주민번호,이름,min(입사일자) CMY,
       (case when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
              and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
              and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
              and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
              and to_char(to_date(substr(NEXT_CMY4,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY5,1,8)
              and to_char(to_date(substr(NEXT_CMY5,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY6,1,8)               
           then substr(NEXT_CMY6,9,8)
                       when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
              and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
              and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
              and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
              and to_char(to_date(substr(NEXT_CMY4,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY5,1,8)          
           then substr(NEXT_CMY5,9,8)
                       when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
              and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
              and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
              and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
           then substr(NEXT_CMY4,9,8)
                       when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
              and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
              and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
           then substr(NEXT_CMY3,9,8)
                       when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
              and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
           then substr(NEXT_CMY2,9,8)
                       when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
           then substr(NEXT_CMY1,9,8)                                                            
           else 퇴사일자 end) rtr
           from (
         select RANK() OVER (PARTITION BY 주민번호 ORDER BY 입사일자 asc) 주민번호_sq,
             주민번호, 이름, 입사일자, 퇴사일자,
                         trunc(months_between( to_date(퇴사일자,'yyyymmdd') ,   to_date(입사일자,'yyyymmdd') ))+1 근속월   ,
                          
                         (select min(b.입사일자|| (case when b.퇴사일자>'20110631' then '20110701' else b.퇴사일자 end) )
                           from 인사원장_Table b
                          where b.주민번호=a.주민번호  and  b.입사일자 >a.입사일자)
                         next_cmy1,
                            
                         (select min(c.입사일자||(case when c.퇴사일자>'20110631' then '20110701' else c.퇴사일자 end) )
                           from 인사원장_Table c
                          where c.주민번호=a.주민번호
                           and c.입사일자 >
                                (select min(b.입사일자)
                                  from 인사원장_Table b
                                  where b.주민번호=a.주민번호 and  b.입사일자 >a.입사일자)
                         )
                          next_cmy2,             
                       
                        (select min(d.입사일자||(case when d.퇴사일자>'20110631' then '20110701' else d.퇴사일자 end) )
                          from 인사원장_Table d
                         where d.주민번호=a.주민번호
                           and d.입사일자 >              
                              (select  min(c.입사일자)
                                from 인사원장_Table c
                               where c.주민번호=a.주민번호
                                 and c.입사일자 >
                                    (select min(b.입사일자)
                                      from 인사원장_Table b
                                     where b.주민번호=a.주민번호 and  b.입사일자 >a.입사일자)
                              ) 
                         )
                          next_cmy3,
                         
                         (select min(e.입사일자||(case when e.퇴사일자>'20110631' then '20110701' else e.퇴사일자 end) )
                           from 인사원장_Table e
                          where e.주민번호=a.주민번호
                            and e.입사일자 >              
                                  (select min(d.입사일자)
                                    from 인사원장_Table d
                                   where d.주민번호=a.주민번호
                                     and d.입사일자 >              
                                      (select min(c.입사일자)
                                        from 인사원장_Table c
                                       where c.주민번호=a.주민번호
                                         and c.입사일자 >
                                            (select min(b.입사일자)
                                              from 인사원장_Table b
                                             where b.주민번호=a.주민번호 and  b.입사일자 >a.입사일자)
                                      ) 
                                  )
                          )            
                          next_cmy4,
                         
                         (select min(f.입사일자||(case when f.퇴사일자>'20110631' then '20110701' else f.퇴사일자 end) )
                            from 인사원장_Table f
                           where f.주민번호=a.주민번호
                             and f.입사일자 >                
                                  (select min(e.입사일자)
                                    from 인사원장_Table e
                                   where e.주민번호=a.주민번호
                                     and e.입사일자 >                
                                          (select min(d.입사일자)
                                            from 인사원장_Table dc
                                           where d.주민번호=a.주민번호
                                             and d.입사일자 >              
                                              (select min(c.입사일자)
                                                from 인사원장_Table c
                                               where c.주민번호=a.주민번호
                                                 and c.입사일자 >
                                                    (select min(b.입사일자)
                                                      from 인사원장_Table b
                                                     where b.주민번호=a.주민번호 and  b.입사일자 >a.입사일자)
                                              ) 
                                          )
                                     
                                  )
                             
                          )                                                           
                          next_cmy5,
                         
                          (select min(g.입사일자||(case when g.퇴사일자>'20110631' then '20110701' else g.퇴사일자 end) )
                            from 인사원장_Table g
                           where g.주민번호=a.주민번호
                             and g.입사일자 >                
                                  (select min(f.입사일자)
                                    from 인사원장_Table f
                                   where f.주민번호=a.주민번호
                                     and f.입사일자 >                
                                          (select min(e.입사일자)
                                            from 인사원장_Table e
                                           where e.주민번호=a.주민번호
                                             and e.입사일자 >                
                                                  (select min(d.입사일자)
                                                    from 인사원장_Table d
                                                   where d.주민번호=a.주민번호
                                                     and d.입사일자 >              
                                                      (select  min(c.입사일자)
                                                        from 인사원장_Table c
                                                       where c.주민번호=a.주민번호
                                                         and c.입사일자 >
                                                            (select min(b.입사일자)
                                                              from 인사원장_Table b
                                                             where b.주민번호=a.주민번호 and  b.입사일자 >a.입사일자)
                                                      ) 
                                                  )
                                             
                                          )
                                     
                                  )
                            )                                                                
                           next_cmy6                                                                           

                        from (
                     select 주민번호, 이름, 입사일자, 퇴사일자
                     from 인사원장_Table ba
                     where 퇴사일자>='20080630' and 퇴사일자<='20110631'
                       and 주민번호 in (select bs.주민번호
                                         from 인사원장_Table bs
                                        where bs.퇴사일자>='20080630' and bs.퇴사일자<='20110631' )
                     order by 주민번호,입사일자 asc
                  ) a
          
           ) group by 주민번호,이름,
               (case when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                      and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
                      and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
                      and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
                      and to_char(to_date(substr(NEXT_CMY4,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY5,1,8)
                      and to_char(to_date(substr(NEXT_CMY5,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY6,1,8)               
                   then substr(NEXT_CMY6,9,8)
                               when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                      and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
                      and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
                      and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
                      and to_char(to_date(substr(NEXT_CMY4,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY5,1,8)          
                   then substr(NEXT_CMY5,9,8)
                               when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                      and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
                      and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
                      and to_char(to_date(substr(NEXT_CMY3,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY4,1,8)
                   then substr(NEXT_CMY4,9,8)
                               when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                      and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
                      and to_char(to_date(substr(NEXT_CMY2,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY3,1,8)
                   then substr(NEXT_CMY3,9,8)
                               when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                      and to_char(to_date(substr(NEXT_CMY1,9,8),'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY2,1,8)
                   then substr(NEXT_CMY2,9,8)
                               when to_char(to_date(퇴사일자,'yyyymmdd')+30,'yyyymmdd')>= substr(NEXT_CMY1,1,8)
                   then substr(NEXT_CMY1,9,8)                                                            
                   else 퇴사일자 end)

      ) a
)
where 근속월>=12  and 퇴사일<>'20110701'        

 

'SQL4Oracle' 카테고리의 다른 글

합계점수 구간 추출  (0) 2023.03.10
Oracle 테이블 명세서 추출  (0) 2023.03.10
그룹별 같은 금액 추출  (0) 2023.03.10
그룹별 같은 비율로 추출  (0) 2023.03.10
dete type 연산  (0) 2023.03.10