[Oracle] 오라클 SUM(CASE WHEN) 사용법

오라클 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을 많이 사용하고 있으니 두 개의 방법을 모두 익혀두면 좋을 듯하다.

예제쿼리(테이블포함).txt
0.00MB

 

[Oracle] 오라클 그룹별 합계 구하기 (SUM)

오라클에서 그룹별로 합계를 구할 때는 SUM 함수를 사용한다. 기본적으로 GROUP BY 절을 사용하여 그룹별로 합계를 구하며, GROUP BY 절을 사용하지 않고 OVER 절을 사용하면 데이터를 그룹화하지 않고

gent.tistory.com

 

[Oracle] 오라클 누적 합계 구하기 (SUM OVER)

오라클에서 누적 합계를 구하기 위해서는 SUM 함수와 OVER 절을 사용하면 된다. OVER 절을 사용하면 GROUP BY 절을 사용하지 않고도 SELECT 절에서 단독으로 합계를 구할 수 있다. OVER 절 내부의 ORDER BY

gent.tistory.com

 

[Oracle] 행을 열로 바꾸는 3가지 방법 (세로를 가로로)

오라클에서 행을 열로 바꾸기 위해서는 다양한 방법이 있다. 그룹별로 집계된 데이터의 행을 열로 바꾸기 위해서는 PIVOT, DECODE 또는 CASE를 사용하며, 여러 행의 문자열을 합쳐서 하나의 열로 바

gent.tistory.com

 

[Oracle] 오라클 가로 합계 구하는 방법

오라클 쿼리에서 가로 합계를 구하기 위해서는, 합계를 구할 각 칼럼을 SUM 함수를 사용하여 합산 후 모두 더하면 가로 합계가 계산된다. 오라클은 NULL과 수치 값을 더할 수 없기 때문에 가로 합

gent.tistory.com

 

 

댓글

Designed by JB FACTORY