간단한 쿼리 질문 올립니다. 0 5 863

by 김주헌 [SQL Query] [2016.08.29 17:58:02]


select

..........

where a.wk_status_cd in ('10', '20', '30') 

급여를 구하는 쿼리인데요,

위 10,20,30이 각각 재직, 퇴사, 휴직 상태코드입니다.

그 중 퇴직한 사원은 퇴사일자(wk_end_ymd)가 급여를 조회하는 해당년월(sum_ym)이라면

출력하고, 그렇지 않으면 안나오게 해야되며,

휴직은 신청일자 중 휴직시작일(to_date) 와 휴직종료일(from_date)이

해당년월과 같을 때 출력하고, 같지 않으면 출력하지 않게 나와야 합니다.

인터넷 열심히 찾아봤는데 어떻게 검색해야 제가 찾는 답이 나올지도 모르겠더라구요ㅠ

문제를 해결할 수 있게 도와주시면 감사합니다!

by Kyle [2016.08.29 18:41:43]
SELECT
    DECODE(
        WK_STATUS_CD,
        '20',       -- 퇴직자
        CASE WHEN WK_END_YMD = SUM_YM THEN '급여'
            ELSE '0'
        END
        ,
        '30',       -- 휴직자
        CASE WHEN SUM_YM < FROM_DATE OR SUM_YM > TO_DATE THEN '급여'
            ELSE '0'
        END
        ,
        '급여'    -- 재직자
        ,
    ) SALARY
FROM ....
WHERE A.WK_STATUS_CD IN ('10', '20', '30')

 


by 김주헌 [2016.08.29 19:30:39]

답변 감사합니다 그런데 혹시 where절에서 조건을 걸 수 있을까요?


by jkson [2016.08.30 08:30:05]

wk_status_cd 컬럼은 인사 정보 테이블에 있을 것 같은데 급여정보 테이블과 조인해야 하는 거죠? 급여정보 테이블에 1년치 급여가 미리 계산되어있는 건가요? 한달 단위로 생성한다면 생성시에 퇴직한 직원 급여정보는 생성되지 않을 것 같은데.. 테이블 구조부터 좀 알려주셔야 대강이라도 쿼리를 만들 수 있을 것 같은데요.

 

SUM_YM 형식이 문자형 'YYYYMM'으로 저장된다고 보고..

WK_END_YMD에는 퇴직일자만 들어가고

FROM_DATE와 TO_DT에는 휴직 정보(날짜형)만 들어간다고 보고 대충 짜보면..

 

SELECT ...
FROM 인사 A, 급여 B
WHERE A.사원번호 = B.사원번호
AND B.SUM_YM = '해당년월'
AND TO_CHAR(NVL(A.WK_END_YMD,TO_DATE('2999-12-31','YYYY-MM-DD')),'YYYYMM') >= B.SUM_YM
AND (NVL(TO_CHAR(A.FROM_DATE,'YYYYMM'),B.SUM_YM) = B.SUM_YM
  OR NVL(TO_CHAR(A.TO_DATE,'YYYYMM'),B.SUM_YM) = B.SUM_YM)

 

이런 식일 것 같은데요.


by 마농 [2016.08.30 08:46:51]
SELECT *
  FROM a
 WHERE a.wk_status_cd in ('10', '20', '30')
   AND ( wk_status_cd = '10'
         OR
         :v_sum_ym IN ( SUBSTR(wk_end_ymd  , 1, 6)
                      , SUBSTR(hu_to_date  , 1, 6)
                      , SUBSTR(hu_from_date, 1, 6)
                      )
       )
;

 


by 김주헌 [2016.08.30 13:36:15]

많은 도움이 되었습니다.

답변주셔서 감사합니다!

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