쿼리질문입니다 0 1 1,068

by 김코옹 [2015.06.06 13:43:49]


안녕하세요 항상 고수님들의 조언 감사하게 생각하고있습니다.

 

현재 작업중인 내용은 ...

1. A테이블 :  수당을 지급받을 대상자들의 집합 

2. B테이블 : 수당이 지급된 사람들의 집합

3. 가지고올 결과 :  2015년 6월기준 A테이블에 '홍길동', '이순신' 이 대상자이고 이중 '이순신'은 수당을 지급받음

                         '유관순'은 대상자가 아니지만 수당을 받게됨

                         ㅇ A테이블 : 사번, 성명 등 인사정보

                         ㅇ B테이블 : 지급기준년월, 사번,금액

지급기준년월 사번 성명 금액 대상자여부
201506 12345 홍길동 0 Y
201506 67890 이순신 100000 Y
201506 99999 유관순 150000 N

 

  SELECT   B.지급기준년월
         , A.사번
         , A.성명
         , NVL (B.금액, 0) AS 금액
    FROM   (SELECT   A.EMP_NO
                   , A.EMP_NM
              FROM   사원정보 A
                   , 부서 B
                   , 수당대상자 C
             WHERE  '201506' BETWEEN SUBSTR (A.입사일, 1, 6) AND  SUBSTR (NVL (A.퇴사일, '99991231'), 1, 6)
               AND B.회사코드 = A.회사코드
               AND B.부서코드 = A.부서코드
               AND A.회사코드 = C.회사코드
               AND A.사번 = C.사번
               AND C.수당대상자여부 = '1'
               AND '201506'|| TO_CHAR (LAST_DAY (TO_DATE ('201506', 'YYYYMM')), 'DD') BETWEEN B.부서생성일 AND  NVL (B.부서종료일, '99991231')
               AND NOT EXISTS (SELECT   '1'
                                 FROM 사원정보
                                WHERE 회사코드 = A.회사코드
                                  AND 사번= A.사번
                                  AND '201506' BETWEEN SUBSTR (휴직시작일, 1, 6) AND  SUBSTR (휴직종료일, 1, 6) )
            )  A
         , (SELECT   회사코드
                   , 사번
                   , 지급기준년월
                   , 금액
              FROM   수당지급내역
             WHERE   회사코드 = '테스트회사'
               AND 지급기준년월 = '201506'
               AND 수당종류 = '수당A'
          ) B
   WHERE A.회사코드 = B.회사코드(+)
     AND A.사번 = B.사번(+)

이런식으로 구상을 해서 테스트해보니 생각한것처럼 결과가 나오긴했습니다. 그런데 대상자가 아닌 직원을 개별적으로 저장하게 해달라는 요청사항이 생겨서 문제입니다.

대상자가 아닌 '유관순'이 수당지급내역 테이블에만 INSERT되어있어 제가 짠 쿼리상으론 조회되지 않습니다... 

아무래도 구조적으로 다시 잡아야 할듯합니다.

대상자이면서 수당이 지급된 직원 + 대상자가 아니지만 수당이 지급된 직원의 결과를 가져오는 방법은 어떤식으로 해야할지 조언을 좀 부탁드립니다.

 

by 쿼리back [2015.06.08 08:32:45]
-- full outer 조인을 이용하면 될듯 합니다.~

 select   B.지급기준년월
        , NVL(A.사번,B.사번) 
        , NVL (B.금액, 0) AS 금액
        , DECODE(A.사번,null,'N','Y') 대상자여부
  FROM   (SELECT   A.EMP_NO
                 , A.EMP_NM
            FROM   사원정보 A
                 , 부서 B
                 , 수당대상자 C
           WHERE  '201506' BETWEEN SUBSTR (A.입사일, 1, 6) AND  SUBSTR (NVL (A.퇴사일, '99991231'), 1, 6)
             AND B.회사코드 = A.회사코드
             AND B.부서코드 = A.부서코드
             AND A.회사코드 = C.회사코드
             AND A.사번 = C.사번
             AND C.수당대상자여부 = '1'
             AND '201506'|| TO_CHAR (LAST_DAY (TO_DATE ('201506', 'YYYYMM')), 'DD') BETWEEN B.부서생성일 AND  NVL (B.부서종료일, '99991231')
             AND NOT EXISTS (SELECT   '1'
                               FROM 사원정보
                              WHERE 회사코드 = A.회사코드
                                AND 사번= A.사번
                                AND '201506' BETWEEN SUBSTR (휴직시작일, 1, 6) AND  SUBSTR (휴직종료일, 1, 6) )
          )  A
       full outer join (SELECT   회사코드
                 , 사번
                 , 지급기준년월
                 , 금액
            FROM   수당지급내역
           WHERE   회사코드 = '테스트회사'
             AND 지급기준년월 = '201506'
             AND 수당종류 = '수당A'
        ) B
        on A.회사코드 = B.회사코드
       AND A.사번 = B.사번
 

 

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