안녕하세요.
통계관련 쿼리에서 TYPE의 1개를 치환후 합치려고합니다.
WITH 회원 AS ( SELECT '홍길동' AS "이름", '2022' AS "생년월일" FROM DUAL UNION ALL SELECT '김철수','2020' FROM DUAL UNION ALL SELECT '김진수','2021' FROM DUAL UNION ALL SELECT '김영희','2024' FROM DUAL UNION ALL SELECT '김민주','2022' FROM DUAL ) SELECT NVL2(이름, 이름, '계') AS type , SUM(CASE WHEN 생년월일 = '2020' THEN 1 ELSE 0 END) y2020 , SUM(CASE WHEN 생년월일 = '2021' THEN 1 ELSE 0 END) y2021 , SUM(CASE WHEN 생년월일 = '2022' THEN 1 ELSE 0 END) y2022 , SUM(CASE WHEN 생년월일 = '2023' THEN 1 ELSE 0 END) y2023 , SUM(CASE WHEN 생년월일 = '2024' THEN 1 ELSE 0 END) y2024 FROM 회원 WHERE 1=1 GROUP BY ROLLUP(이름) ORDER BY 이름 ASC;
위 쿼리에서 김영희를 김민주로 치환후 합계는 합치려고 합니다.
아래표는 원하는 결과값입니다.
TYPE | Y2020 | Y2021 | Y2022 | Y2023 | Y2024 |
김민주 | 0 | 0 | 1 | 0 | 1 |
김진수 | 0 | 1 | 0 | 0 | 0 |
김철수 | 1 | 0 | 0 | 0 | 0 |
홍길동 | 0 | 0 | 1 | 0 | 0 |
계 | 1 | 1 | 2 | 0 | 1 |
1. 집계하기 전에 CASE 나 DECODE 로 이름 바꾸시면 됩니다.
2. ELSE 0 을 제거하고 COUNT 로 바꾸시는게 좋습니다.
3. NVL2 보다는 NVL 이 더 적절합니다.
4. 연도 조건으로 집계 대상을 줄여주는 것이 좋습니다.
WITH 회원 AS ( SELECT '홍길동' 이름, '2022' 생년월일 FROM dual UNION ALL SELECT '김철수', '2020' FROM dual UNION ALL SELECT '김진수', '2021' FROM dual UNION ALL SELECT '김영희', '2024' FROM dual UNION ALL SELECT '김민주', '2022' FROM dual ) SELECT NVL(이름, '계') type , COUNT(CASE 생년월일 WHEN '2020' THEN 1 END) y2020 , COUNT(CASE 생년월일 WHEN '2021' THEN 1 END) y2021 , COUNT(CASE 생년월일 WHEN '2022' THEN 1 END) y2022 , COUNT(CASE 생년월일 WHEN '2023' THEN 1 END) y2023 , COUNT(CASE 생년월일 WHEN '2024' THEN 1 END) y2024 FROM (SELECT CASE 이름 WHEN '김영희' THEN '김민주' ELSE 이름 END 이름 , 생년월일 FROM 회원 WHERE 생년월일 BETWEEN '2020' AND '2024' ) WHERE 1=1 GROUP BY ROLLUP(이름) ORDER BY 이름 ;