테이블에 일부 정보를 가지고 더 많은 데이터를 조회하는 쿼리 질문 입니다. 0 3 1,337

by 유환 [SQL Query] sql [2018.10.20 16:16:33]


안녕하세요.  오라클 사용 중입니다.


테이블은 아래와 같이 
부서코드, 직원코드, 근무년월, 직원명 으로 되어 있습니다.
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       홍길동   

by 야신 [2018.10.20 22:32:30]
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                  

 


by 마농 [2018.10.22 09:19:40]
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
;

 


by 유환 [2018.10.27 22:43:48]

늦었습니다.

두분다 감사합니다.

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