group by시 특정데이터 치환 후 합계 0 2 4,013

by 밍밍밍밍 오라클 group by [2024.04.23 16:31:09]


안녕하세요.

통계관련 쿼리에서 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

 

by 마농 [2024.04.23 16:48:32]

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 이름
;

 


by 밍밍밍밍 [2024.04.23 17:20:33]

답변 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입