[Oracle] 오라클 SUM(CASE WHEN) 사용법
- 데이터베이스/오라클
- 2024. 5. 22.
오라클 SQL에서 합산 값을 가로로 표시할 때 SUM(CASE WHEN) 구문을 사용할 수 있다. SUM 함수 내부에서 CASE 연산자로 조건을 부여하여 해당 조건에 맞는 값만 합산을 하는 방식이다. SUM(CASE WHEN)은 SUM(DECODE)와 유사한 방식으로 실무에서 많이 사용하는 쿼리문이니 잘 익혀두면 두루두루 사용할 수 있다.
목차 |
기본 사용법
SELECT SUM(CASE WHEN job = 'SALESMAN' THEN sal END) AS salesman_sal
FROM emp
SUM (CASE WHEN) 구문은 특정 조건일 때 합산을 하기 위해서 사용하는 방법이다. 오라클에서는 SUM(DECODE) 방법을 많이 사용하지만 표준 SQL 구문인 CASE WHEN을 많이 사용하는 추세이다. CASE WHEN을 사용하면 조건을 여러 개 부여할 수 있기 때문에 상황에 따라서 유리한 측면도 있다.
세로의 합산 값을 가로로 표시하기
SELECT SUM(CASE WHEN job = 'MANAGER' THEN sal END) AS manager_sal
, SUM(CASE WHEN job = 'SALESMAN' THEN sal END) AS salesman_sal
, SUM(CASE WHEN job = 'CLERK' THEN sal END) AS clerk_sal
FROM emp
위의 예제는 직업별 급여를 합산하여 칼럼으로 표시한 예제이다.
SUM(CASE WHEN)은 합산 값을 가로로(칼럼)로 표시할 때 많이 사용한다.
합산 조건을 여러개 부여하기
SELECT SUM(CASE WHEN job = 'MANAGER' AND sal > 2500 THEN sal END) AS manager_sal
, SUM(CASE WHEN job = 'SALESMAN' AND sal > 1500 THEN sal END) AS salesman_sal
, SUM(CASE WHEN job = 'CLERK' AND sal > 1000 THEN sal END) AS clerk_sal
FROM emp
CASE WHEN의 조건을 한 개가 아니라 여러 개 부여할 수 있다. 보통 AND, OR 연산자를 많이 사용하지만 상황에 따라서 IN, LIKE, EXISTS 등 복잡한 연산자를 사용하여 조건을 부여할 수 있다.
특정 조건의 건수 합산하기
SELECT SUM(CASE WHEN job = 'MANAGER' THEN 1 ELSE 0 END) AS manager_cnt
, SUM(CASE WHEN job = 'SALESMAN' THEN 1 ELSE 0 END) AS salesman_cnt
, SUM(CASE WHEN job = 'CLERK' THEN 1 ELSE 0 END) AS clerk_cnt
FROM emp
조건에 맞는 칼럼의 값을 합산할 수도 있지만, 해당 조건의 건수를 구할 때도 사용할 수 있다.
조건에 맞으면 1을 반환하고 맞지 않으면 0을 반환하여 건수를 합산할 수 있다. ELSE문 사용하지 않으면 건수가 없을 경우 NULL(공백)으로 표시할 수 있으니 상황에 맞게 ELSE 0을 빼고 사용하면 된다.
연월별 집계표 만들기 (고급예제)
SELECT TO_CHAR(hiredate, 'YYYY') AS "입사년도"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '01' THEN 1 ELSE 0 END) AS "01월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '02' THEN 1 ELSE 0 END) AS "02월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '03' THEN 1 ELSE 0 END) AS "03월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '04' THEN 1 ELSE 0 END) AS "04월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '05' THEN 1 ELSE 0 END) AS "05월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '06' THEN 1 ELSE 0 END) AS "06월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '07' THEN 1 ELSE 0 END) AS "07월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '08' THEN 1 ELSE 0 END) AS "08월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '09' THEN 1 ELSE 0 END) AS "09월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '10' THEN 1 ELSE 0 END) AS "10월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '11' THEN 1 ELSE 0 END) AS "11월"
, SUM(CASE WHEN TO_CHAR(hiredate, 'MM') = '12' THEN 1 ELSE 0 END) AS "12월"
FROM emp
GROUP BY TO_CHAR(hiredate, 'YYYY')
ORDER BY 1
위의 예제는 년도별 + 월별 입사 건수를 구하는 쿼리문이다.
연월별 집계표는 실무에서 아주 많이 사용하는 쿼리문이다. 오라클에서는 SUM(DECODE)를 사용하여 쿼리문을 작성하지만 최근에는 CASE WHEN을 많이 사용하고 있으니 두 개의 방법을 모두 익혀두면 좋을 듯하다.