INDEX | DEPT_NAME | DEPT_SEQ | POS_NAME | POS_SEQ | USER_NAME |
1234 | 인사팀 | 001 | 인사팀장 | 1 | 강호동 |
1234 | 홍보팀 | 002 | 사원 | 2 |
강호동 |
1234 | 기획팀 | 003 | 부팀장 | 3 | 강호동 |
5678 | 인사팀 | 001 | 사원 | 1 | 유재석 |
7890 | 기획팀 | 003 | 사원 | 1 | 이수근 |
위 테이블은 사용자정보 테이블입니다.
한 사람이 여러개의 직위를 겸할 수 있고, POS_SEQ = 1 본직, 나머지는 겸직 정보입니다.
휴가를 올릴 경우에는 겸직에 대해 대행자를 지정하여 휴가를 올리는데,
휴가(대행)정보 테이블은 아래와 같습니다.
[휴가(대행)정보테이블]
INDEX | ROW_SEQ | POS_SEQ | REGENCY(대행자) | ABSENCE_SDATE | ABSENCE_EDATE |
1234 | 1 | 1 | 5678 | 2019-05-07 8:00 | 2019-05-07 19:00 |
1234 | 2 | 3 | 7890 | 2019-05-07 8:00 | 2019-05-07 19:00 |
PK = INDEX, ROW_SEQ 이며, 어떤 직위에 대한 대행정보인지는 POS_SEQ로 확인합니다.
이 두개의 테이블을 연결하여 추출하고자 하는 row는 아래의 표입니다.
INDEX | USER_NAME | DEPT_NAME | POS_NAME | REGENCY | ABSENCE_DATE |
1234 | 강호동 | 인사팀 | 인사팀장 | 유재석 | 2019-05-07 8:00~2019-05-07 19:00 |
1234 | 강호동 | 홍보팀 | 사원 | 2019-05-07 8:00~2019-05-07 19:00 | |
1234 | 강호동 | 기획팀 | 부팀장 | 이수근 | 2019-05-07 8:00~2019-05-07 19:00 |
[강호동,홍보팀,사원]에 대한 대행자 정보를 입력하지 않을 경우 휴가(대행)정보 테이블에 ROW는 쌓이지 않는 구조입니다.
다른 대행자정보를 보여줌과 동시에 '강호동,홍보팀,사원'이 현재(오늘) 휴가중임을 나타내고 싶습니다.
도움 부탁 드립니다.
WITH emp(idx, dept_name, dept_seq, pos_name, pos_seq, user_name) AS ( SELECT 1234, '인사팀', '001', '인사팀장', 1, '강호동' FROM dual UNION ALL SELECT 1234, '홍보팀', '002', '사원' , 2, '강호동' FROM dual UNION ALL SELECT 1234, '기획팀', '003', '부팀장' , 3, '강호동' FROM dual UNION ALL SELECT 5678, '인사팀', '001', '사원' , 1, '유재석' FROM dual UNION ALL SELECT 7890, '기획팀', '003', '사원' , 1, '이수근' FROM dual ) , abs(idx, row_seq, pos_seq, regency, absence_sdate, absence_edate) AS ( SELECT 1234, 1, 1, 5678, '2019-05-08 08:00', '2019-05-08 19:00' FROM dual UNION ALL SELECT 1234, 2, 3, 7890, '2019-05-08 08:00', '2019-05-08 19:00' FROM dual ) SELECT * FROM (SELECT a.idx , a.user_name , a.dept_name , a.pos_seq , a.pos_name , c.user_name regency , MIN(b.absence_sdate ||'~'|| b.absence_edate) OVER(PARTITION BY a.idx) absence_date FROM emp a LEFT OUTER JOIN abs b ON a.idx = b.idx AND a.pos_seq = b.pos_seq AND b.absence_sdate < TO_CHAR(sysdate + 1, 'yyyy-mm-dd') AND b.absence_edate > TO_CHAR(sysdate , 'yyyy-mm-dd') LEFT OUTER JOIN emp c ON b.regency = c.idx ) WHERE absence_date != '~' ORDER BY idx, pos_seq ;