안녕하세요. 오라클 사용 중입니다.
테이블은 아래와 같이
부서코드, 직원코드, 근무년월, 직원명 으로 되어 있습니다.
pk는 부서코드, 직원코드, 근무년월 입니다.
검색조건을 from:201805 ~ to:201810 이면
wordk_yydd 를 보고 아래 결과 처럼
근무한 년월은 빼고 근무 하지 않는 년월을 뽑아서 보여줄수 있나요?
sql 조회 안되면 java 나 c 프로그램으로 건건이 돌려가면서 뽑아야 하는대
sql만으로 조회 가능한가요?
--------------------------------
dept_Cd emp_cd wordk_yydd emp_nm
--------------------------------
1111 0001 201805 홍길동
1111 0001 201807 홍길동
1111 0002 201806 김영철
2222 0003 201805 나철수
2222 0003 201806 나철수
3333 0001 201808 홍길동
=====================
-- 조회결과
1111 0001 201806 홍길동
1111 0001 201808 홍길동
1111 0001 201809 홍길동
1111 0001 201810 홍길동
1111 0002 201805 김영철
1111 0002 201807 김영철
1111 0002 201808 김영철
1111 0002 201809 김영철
1111 0002 201810 김영철
2222 0003 201807 나철수
2222 0003 201808 나철수
2222 0003 201809 나철수
2222 0003 201810 나철수
3333 0001 201806 홍길동
3333 0001 201807 홍길동
3333 0001 201809 홍길동
3333 0001 201810 홍길동
SELECT dept_Cd, emp_cd, yymm, emp_nm FROM ( SELECT * FROM ( SELECT DISTINCT dept_Cd, emp_cd, emp_nm FROM tmp ) , ( SELECT TO_CHAR(ADD_MONTHS(to_date('201805','YYYYMM') , LEVEL -1),'YYYYMM') yymm FROM DUAL CONNECT BY LEVEL <= months_between(to_date('201810','YYYYMM'),to_date('201805','YYYYMM')) + 1 ) dt ) a WHERE NOT EXISTS ( SELECT 1 FROM tmp b WHERE a.dept_cd = b.dept_cd AND a.emp_cd = b.emp_cd AND a.yymm = b.wordk_yydd ) ORDER BY 1,2,3,4
WITH t AS ( SELECT '1111' dept_Cd, '0001' emp_cd, '201805' wordk_yydd, '홍길동' emp_nm FROM dual UNION ALL SELECT '1111', '0001', '201807', '홍길동' FROM dual UNION ALL SELECT '1111', '0002', '201806', '김영철' FROM dual UNION ALL SELECT '2222', '0003', '201805', '나철수' FROM dual UNION ALL SELECT '2222', '0003', '201806', '나철수' FROM dual UNION ALL SELECT '3333', '0001', '201808', '홍길동' FROM dual ) SELECT a.dept_Cd , a.emp_cd , b.wordk_yydd , a.emp_nm FROM (SELECT DISTINCT dept_Cd, emp_cd, emp_nm FROM t ) a CROSS JOIN (SELECT TO_CHAR(ADD_MONTHS(s, LEVEL - 1), 'yyyymm') wordk_yydd FROM (SELECT TO_DATE('201805', 'yyyymm') s , TO_DATE('201810', 'yyyymm') e FROM dual) CONNECT BY LEVEL <= MONTHS_BETWEEN(e, s) + 1 ) b LEFT OUTER JOIN t c ON a.dept_Cd = c.dept_Cd AND a.emp_cd = c.emp_cd AND a.emp_nm = c.emp_nm AND b.wordk_yydd = c.wordk_yydd WHERE c.emp_cd IS NULL ORDER BY 1, 2, 3 ;