안녕하세요 구루비 회원님들
오랜만에 뵙습니다! 오늘도 업무 중 도저히 어떻게해야될지 갈피를 못잡아 질문드리러 왔습니다...
표로 간단하게 말씀드리겠습니다..
연령 | 총원 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10~ | 15~ | 20~ |
20세이하 |
00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
21~25 | 124 | 100 | 24 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
26~30 | 422 | |||||||||||||
31~35 | 21 | |||||||||||||
36~40 | 545 | |||||||||||||
46~50 | 12 | |||||||||||||
51~55 | 12 | |||||||||||||
56~60 | 12 | |||||||||||||
(총계) | ... |
위와같이 이런형식의 데이터를 조회 해야되는데 근속 년수별 해당하는 기간의 인원수를 조회 해야되는데
어떻게 row로 범위를 뽑아 카운트를 해야되는지 모르겠습니다...ㅜ 설명도 좀 이상한거 같은데..
코멘트 부탁드리겠습니다!
WITH code_t AS ( SELECT 1 lv, 0 s, 20 e,'20세이하' gb FROM dual UNION ALL SELECT 2, 21, 25, '21~25' FROM dual UNION ALL SELECT 3, 26, 30, '26~30' FROM dual UNION ALL SELECT 4, 31, 35, '31~35' FROM dual UNION ALL SELECT 5, 36, 40, '36~40' FROM dual UNION ALL SELECT 6, 46, 50, '46~50' FROM dual UNION ALL SELECT 7, 51, 55, '51~55' FROM dual UNION ALL SELECT 8, 56, 99, '56세이상' FROM dual ) SELECT NVL(a.gb, '(총계)') gb , COUNT(x) tot , COUNT(DECODE(x, 0, 1)) "0" , COUNT(DECODE(x, 1, 1)) "1" , COUNT(DECODE(x, 2, 1)) "2" , COUNT(DECODE(x, 3, 1)) "3" , COUNT(DECODE(x, 4, 1)) "4" , COUNT(DECODE(x, 5, 1)) "5" , COUNT(DECODE(x, 6, 1)) "6" , COUNT(DECODE(x, 7, 1)) "7" , COUNT(DECODE(x, 8, 1)) "8" , COUNT(DECODE(x, 9, 1)) "9" , COUNT(CASE WHEN x BETWEEN 10 AND 14 THEN 1 END) "10~" , COUNT(CASE WHEN x BETWEEN 15 AND 19 THEN 1 END) "15~" , COUNT(CASE WHEN x >= 20 THEN 1 END) "20~" FROM code_t a , (SELECT FLOOR(MONTHS_BETWEEN(TRUNC(sysdate), TO_DATE(enter_dt, 'yyyymmdd')) / 12) x -- 근속년 , FLOOR(MONTHS_BETWEEN(TRUNC(sysdate), TO_DATE(birth_dt, 'yyyymmdd')) / 12) y -- 만나이 FROM emp WHERE retire_dt IS NULL -- 퇴직자 제외 ) b WHERE b.y(+) BETWEEN a.s AND a.e GROUP BY ROLLUP((a.lv, a.gb)) ORDER BY lv ;