안녕하세요 구루비 회원님들
오랜만에 뵙습니다! 오늘도 업무 중 도저히 어떻게해야될지 갈피를 못잡아 질문드리러 왔습니다...
표로 간단하게 말씀드리겠습니다..
| 연령 | 총원 | 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
;
감사합니다... 이런 비슷한쿼리를 세개정도 짜야되는데 한번에 다 해결될듯 싶습니다.. 고개 숙여 감사드립니다
쿼리 수정 했습니다.
아우터 조인 기호(+) 를 빼먹었네요.
넵 감사합니다 안그래도 로우가 좀 덜나오길래 확인 후 추가 했습니다! 감사합니다
아!. 또 수정했어요.
- CEIL ---> FLOOR
아! 아침부터 한번더 훑어 주셔서 감사합니다 반올림보다는 버리는게 맞겠네용 하핳