쿼리 문의 드리고자 합니다.
우선 환경은 오라클 10G 를 사용하고 있습니다.
원하는 것은 인사원장 테이블을 이용하여 아래와 같이 퇴직율을 구하고자 합니다.
구분 | 1월 | 2월 | 12월 | 누계
| 월말인원 | 퇴직인원 | 퇴직율 | 월말인원 | 퇴직인원 | 퇴직율 | 월말인원 | 퇴직인원 | 퇴직율 | 월말평균인원 | 퇴직인원 | 퇴직율
-----------------------------------------------------------------------------------------------------------------------------------------
회사전체 |
-----------------------------------------------------------------------------------------------------------------------------------------
A부문 |
-----------------------------------------------------------------------------------------------------------------------------------------
B부문 |
-----------------------------------------------------------------------------------------------------------------------------------------
C부문 |
-----------------------------------------------------------------------------------------------------------------------------------------
쿼리 능력이 부족하여 단순 무식하게 작업했는데,
월말인원은 재직여부를 아래와 같이 월별로 구하여 12개월치의 서브쿼리를 생성했습니다.
SELECT YR01.BUMUN_CD,
YR01.ALL_CNT,
YR01.RETIRE_CNT,
YR01.RETIRE_RATIO,
YR02.ALL_CNT,
YR02.RETIRE_CNT,
YR02.RETIRE_RATIO,
FROM
(
SELECT BUMUN_CD,
COUNT(GG) ALL_CNT,
COUNT(DECODE(GG,2,1)) RETIRE_CNT,
ROUND(COUNT(DECODE(GG,2,1)) / COUNT(GG) * 100,2) RETIRE_RATIO
FROM (
SELECT CASE WHEN WORK_YN = 'Y' AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101') THEN
1
WHEN WORK_YN = 'N' AND RETIRE_YMD BETWEEN TO_DATE(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101','YYYYMMDD') AND LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101') THEN
2
ELSE 0
END AS GG,
BUMUN_CD,
EMP.*
FROM EMP_MASTER EMP, -- 임직원테이블
(SELECT TO_DATE('20151028','YYYYMMDD') STD_YMD FROM DUAL) BASE -- 기준일자(조회할때 변동가능)
-- 현재 재직이면서 기준월 말일이전에 입사했거나, 기준월 1일 이후퇴사이면서 기준월 말일이전 입사자 기준
WHERE ((WORK_YN = 'Y' AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101'))
OR (WORK_YN = 'N' AND RETIRE_YMD >= TO_DATE(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101','YYYYMMDD') AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0101')))
)
GRUOP BY ROLLUP(BUMUN)
ORDER BY BUMUN NULLS FIRST
) YR01,
(
SELECT BUMUN_CD,
COUNT(GG) ALL_CNT,
COUNT(DECODE(GG,2,1)) RETIRE_CNT,
ROUND(COUNT(DECODE(GG,2,1)) / COUNT(GG) * 100,2) RETIRE_RATIO
FROM (
SELECT CASE WHEN WORK_YN = 'Y' AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201') THEN
1
WHEN WORK_YN = 'N' AND RETIRE_YMD BETWEEN TO_DATE(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201','YYYYMMDD') AND LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201') THEN
2
ELSE 0
END AS GG,
BUMUN_CD,
EMP.*
FROM EMP_MASTER EMP, -- 임직원테이블
(SELECT TO_DATE('20151028','YYYYMMDD') STD_YMD FROM DUAL) BASE -- 기준일자(조회할때 변동가능)
-- 현재 재직이면서 기준월 말일이전에 입사했거나, 기준월 1일 이후퇴사이면서 기준월 말일이전 입사자 기준
WHERE ((WORK_YN = 'Y' AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201'))
OR (WORK_YN = 'N' AND RETIRE_YMD >= TO_DATE(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201','YYYYMMDD') AND HIRE_YMD <= LAST_DAY(TO_CHAR(BASE.STD_YMD,'YYYY')||'0201')))
)
GRUOP BY ROLLUP(BUMUN)
ORDER BY BUMUN NULLS FIRST
) YR02,
....
이렇게 구하다 보니 데이터가 엉망이 되네요.
해당 쿼리를 참고(만 하시고)하여 윗 표 형태로 조회가 가능할지 문의드립니다.
능력자 분들의 도움을 받을 수 있으면 좋겠습니다. 미리 감사드립니다.
|