안녕하세요.
통계관련 쿼리에서 TYPE의 1개를 치환후 합치려고합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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. 연도 조건으로 집계 대상을 줄여주는 것이 좋습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 이름 ; |