2오라클 조회쿼리 짜다 막혀서 급질문드립니다 ㅠ 0 3 1,673

by 빡친다 [Oracle 기초] [2017.05.25 17:36:54]


안녕하세요 인사팀 전산을맡고있습니다. 오늘 쿼리짜다 5시간동안해메서 질문드립니다.

발령테이블, 부서직무테이블 두개 조인해서 결과데이터를 뽑아내야하는데 잘안됩니다...ㅠ

주마스터테이블이 발령테이블입니다.

발령테이블에 데이터는 컬럼 발령일자, 부서에 5건이 있습니다.

발령일자    부서         
19840501   편집국
19841101   사회부
19890708   정치부
19980212   정치부
20040101   주간부
 

부서직무테이블에 데이터는 컬럼 업무시작일, 부서, 직무내용에 4건이 있습니다.

업무시작일     부서       직무내용                                                                              
19841101     사회부       기동팀                                       
19890708     정치부       정당팀                                       
20000101     정치부       뉴욕  담당                                  
20040101     주간부       주간 제작 총괄지휘                                           
    
 

이 두 테이블을 잘 조인해서 발령테이블 기준으로

발령일자, 부서 직무내용 을 뽑아내야합니다.

아래 데이터가 제가 원하게 뽑아야하는 5건 데이터입니다.

 

발령일자       부서           직무내용

19840501     편집국          null
19841101     사회부          기동팀
19890708     정치부          정당팀
19980212     정치부          뉴욕담당
20040101     주간부          주간 제작 총괄지휘  

발령일자와 업무시작일자가 정확히 매칭이 안되서 어렵습니다.ㅠ
4번째 줄 직무내용 컬럼에 뉴욕담당이 들어가는게 핵심인거같습니다.  발령일자와 제일가까운 일시작일자 업무내용이 뉴욕담당이기 때문입니다. 고수님들 답변부탁드립니다!!!

 

by 마농 [2017.05.25 19:27:36]

일자가 가까운것을 선택하는 것이 과연 맞는 선택인지?
두개 이상의 직무가 걸쳐 있다면?
 - 더 많은 기간의 직무를 보여주는게 맞지 않을 런지요?
 - 아니면 직무 리스트로 전체 직무 컴마로 연결해 보여주던가?


by 빡친다 [2017.05.26 11:54:42]

답변감사합니다 일자가 제일가깝다고 선택되는것은아니고

발령이 떨어지고 바로 일 시작하는것이 아니기때문에 발령일자와 일시작일이 다르다고합니다.

테이블 두개가 참 희한한데 select절에 함수써서라도 풀 수 있을까요


by 마농 [2017.05.26 12:36:47]
WITH t1 AS
(
SELECT 1 empno, '19840501' dt, '편집국' dept FROM dual
UNION ALL SELECT 1, '19841101', '사회부' FROM dual
UNION ALL SELECT 1, '19890708', '정치부' FROM dual
UNION ALL SELECT 1, '19980212', '정치부' FROM dual
UNION ALL SELECT 1, '20040101', '주간부' FROM dual
)
,t2 AS
(
SELECT 1 empno, '19841101' dt, '사회부' dept, '기동팀' jikmu FROM dual
UNION ALL SELECT 1, '19890708', '정치부', '정당팀' FROM dual
UNION ALL SELECT 1, '20000101', '정치부', '뉴욕  담당' FROM dual
UNION ALL SELECT 1, '20040101', '주간부', '주간 제작 총괄지휘' FROM dual
)
SELECT a.empno, a.dt, a.dept
     , b.dt, b.jikmu
  FROM (SELECT empno, dt, dept
             , TO_DATE(dt, 'yyyymmdd') sdt
             , LEAD(dt, 1, '99991231') OVER(PARTITION BY empno ORDER BY dt) edt
          FROM t1
        ) a
     , t2 b
 WHERE a.empno = b.empno(+)
   AND a.dept = b.dept(+)
   AND a.dt <= b.dt(+)
   AND a.edt > b.dt(+)
 ORDER BY a.empno, a.dt
;

 

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