테이블 조회 시 바로 전에 부여받은 사번을 포함하여 조회하는 쿼리 0 7 1,952

by DONKEY [SQL Query] [2016.08.04 16:04:40]


MIJ_EMPLOYE 라는 테이블이 있습니다. 인사 기본 테이블이며, KEY는 EMP_NO 입니다.

궁금한것은 ... 인사 기본 테이블의 모든 데이터를 조회 하되 이전 사원번호를 포함하여 조회 하는 것입니다.

직원은 신규 발령이나 정직원 채용등으로인해 사원번호가 변경 될 수 있습니다.

1.변경 될 경우에는 입사일자가 사번 변경일자로 저장됩니다.

2.사번 변경 시 기존 사번은 퇴직 처리, 신규 사번은 재직

3.아래와 같이 주민등록 번호 하나에 대해 여러 사번이 생성 될 수 있습니다.

예를 들어
EMP_NO PRE_EMP_NO  ENT_YMD   재/퇴  주민번호           ......................
861685 NULL        19861101   퇴직  910312-1XXXXXX
441180 861685      19991211   퇴직  910312-1XXXXXX
442358 441180      20070312   퇴직  910312-1XXXXXX
442231 442358      20080311   퇴직  910312-1XXXXXX
442090 442231      20090305   퇴직  910312-1XXXXXX
442500 442090      20100114   퇴직  910312-1XXXXXX
442710 442500      20110301   재직  910312-1XXXXXX

123456 NULL        20160804    재직  910412-1XXXXXX <-- 사번 변경이 없었던 사원

                      .
                      .
                      .
                      .
                      .
                      .
                      .
11097 ROW

부탁드립니다..

by 박영식 [2016.08.04 16:14:42]
WITH T (EMP_NO, ENT_YMD, 재퇴, 주민번호) AS (
SELECT '861685', '19861101', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '441180', '19991211', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442358', '20070312', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442231', '20080311', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442090', '20090305', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442500', '20100114', '퇴직', '910312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442710', '20110301', '재직', '910312-1XXXXXX' FROM DUAL 
)
SELECT EMP_NO
      ,LAG(EMP_NO) OVER(ORDER BY 1) AS PRE_EMP_NO
      ,ENT_YMD
      ,재퇴
      ,주민번호
  FROM T

단순히 이전사번을 같이 조회 하면되는것인지요?


by DONKEY [2016.08.04 16:25:27]

주민 번호를 기준으로 변경된 사번의 이전 사번을 포함하여 가져오려고 하고 있습니다.

설명을 조리있게 하지 못하겠는데.. 주민번호를 기준으로 주민번호는 같은데 변경된 사번이 존재한다라고 가정하면 현재사번 이전사번 이며 변경된 사번이 존재 하지 않는다 현재사번 NULL인 형태입니다..


by 박영식 [2016.08.04 16:43:28]
WITH T (EMP_NO, ENT_YMD, 재퇴, 주민번호) AS (
SELECT '861685', '19861101', '퇴직', '900112-1XXXXXX' FROM DUAL UNION ALL
SELECT '441180', '19991211', '퇴직', '910502-1XXXXXX' FROM DUAL UNION ALL
SELECT '442358', '20070312', '퇴직', '920111-1XXXXXX' FROM DUAL UNION ALL
SELECT '442231', '20080311', '퇴직', '930312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442090', '20090305', '퇴직', '940312-1XXXXXX' FROM DUAL UNION ALL
SELECT '442500', '20100114', '퇴직', '910502-1XXXXXX' FROM DUAL UNION ALL
SELECT '412710', '20110301', '재직', '950516-1XXXXXX' FROM DUAL UNION ALL
SELECT '462500', '20100114', '퇴직', '900112-1XXXXXX' FROM DUAL 
)
SELECT EMP_NO
      ,CASE WHEN RN > 1 THEN LAG(EMP_NO) OVER(ORDER BY 1)
                        ELSE NULL
        END AS PRE_EMP_NO
      ,ENT_YMD
      ,재퇴
      ,주민번호
  FROM (
        SELECT EMP_NO
              ,ENT_YMD
              ,재퇴
              ,주민번호
              ,ROW_NUMBER() OVER(PARTITION BY 주민번호 ORDER BY EMP_NO) AS RN
          FROM T A
        )      

이게 맞나요? 


by DONKEY [2016.08.04 17:10:53]
SELECT EMP_NO
         , CASE WHEN RN > 1 THEN LAG(EMP_NO) OVER(ORDER BY 1) ELSE NULL END AS PRE_EMP_NO
         , PRSN_ID
      FROM (SELECT EMP_NO
                 , ROW_NUMBER() OVER(PARTITION BY PRSN_ID ORDER BY EMP_NO) AS RN
                 , PRSN_ID
              FROM MIJ_EMPLOYE) A
              ORDER BY EMP_NO DESC

요런식으로 작성해서 돌려본결과 데이터가 쫌 이상했습니다.. 제설명부족인거 같습니다


by DONKEY [2016.08.04 17:15:48]

음 구체적으로 말씀드리자면 

변경 사번  변경 직전 사번 주민등록번호

990199        990202         380703-16XXXXX 이런 데이터가 나왔는데

이 직원 주민 등록번호로 조회 했을시 조회결과가

사번

680103

990199 로 조회가 되었습니다. 즉 결과 데이터는 990199 680103 이 나왔어야 맞는 데이터였습니다. 


by 마농 [2016.08.04 16:44:25]

, LAG(emp_no) OVER(PARTITION BY jumin_no ORDER BY ent_ymd) AS pre_emp_no


by DONKEY [2016.08.04 17:11:14]

감사합니다 원하는 데이터가 나왔습니다!

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