[Oracle] 오라클 SUM(DECODE) 사용법
- 데이터베이스/오라클
- 2024. 6. 21.
오라클 SQL에서 SUM(DECODE)는 특정 조건의 데이터를 합산해서 가로로 표시할 때 사용하는 방법이다. DECODE 함수가 오라클에서만 사용가능하기 때문에 표준 SQL인 SUM(CASE WHEN) 구문을 권장하기도 하지만, 오라클에서 사용할 때는 SUM(DECODE) 구문이 조금 더 직관적이고, 쿼리문이 조금 더 간결하기 때문에 실무에서 많이 사용하는 편이다. 두 가지 방법 모두 동일한 결과를 얻을 수 있기 때문에 취향에 따라서 사용하면 된다.
목차 |
기본 사용법
SELECT SUM(DECODE(job, 'MANAGER', sal)) AS manager_sal
FROM emp
SUM(DECODE) 구문은 특정 조건일 때 데이터를 합산하기 위해 사용하는 방법이다. 요즘은 표준 SQL인 SUM(CASE WHEN)을 많이 사용하지만, 오라클에서는 SUM(DECODE) 구문이 조금 더 직관적인 면이 있기 때문에 많이 사용하는 편이다. 그러나 조금 복잡한 조건을 부여할 때는 SUM(CASE WHEN)을 사용하는 것이 효율적일 것이다.
세로의 합산 값을 가로로 표시하기
SELECT SUM(DECODE(job, 'MANAGER', sal)) AS manager_sal
, SUM(DECODE(job, 'SALESMAN', sal)) AS salesman_sal
, SUM(DECODE(job, 'CLERK', sal)) AS clerk_sal
FROM emp
위의 예제는 SUM(DECODE) 구문의 대표적인 예제이다.
GROUP BY 절을 사용하여 집계를 하면 결과가 행으로 표시되는데, SUM(DECODE) 구문을 사용하면 세로의 합산 결과를 가로로 표시할 수 있다.
특정 조건의 건수 합산하기
SELECT SUM(DECODE(job, 'MANAGER', 1)) AS manager_cnt
, SUM(DECODE(job, 'SALESMAN', 1)) AS salesman_cnt
, SUM(DECODE(job, 'CLERK', 1)) AS clerk_cnt
, SUM(DECODE(job, 'PROGRAMER', 1)) AS programer_cnt
FROM emp
특정 조건 데이터의 건수를 집계할 때도 사용할 수 있다. 위의 경우는 SUM 함수 대신 COUNT 함수를 사용할 수도 있지만, 의미상 SUM 함수를 사용하는 것이 조금 더 직관적일 수 있다.
SELECT SUM(DECODE(job, 'MANAGER', 1, 0)) AS manager_cnt
, SUM(DECODE(job, 'SALESMAN', 1, 0)) AS salesman_cnt
, SUM(DECODE(job, 'CLERK', 1, 0)) AS clerk_cnt
, SUM(DECODE(job, 'PROGRAMER', 1, 0)) AS programer_cnt
FROM emp
DECODE 함수의 ELSE 영역에서 0을 반환하면, 조건의 데이터가 없어도 0을 표시할 수 있다.
연월별 집계표 만들기 (고급예제)
SELECT TO_CHAR(hiredate, 'YYYY') AS "입사년도"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '01', 1, 0)) AS "01월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '02', 1, 0)) AS "02월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '03', 1, 0)) AS "03월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '04', 1, 0)) AS "04월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '05', 1, 0)) AS "05월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '06', 1, 0)) AS "06월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '07', 1, 0)) AS "07월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '08', 1, 0)) AS "08월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '09', 1, 0)) AS "09월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '10', 1, 0)) AS "10월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '11', 1, 0)) AS "11월"
, SUM(DECODE(TO_CHAR(hiredate, 'MM'), '12', 1, 0)) AS "12월"
FROM emp
GROUP BY TO_CHAR(hiredate, 'YYYY')
ORDER BY 1
위의 예제는 연도별 + 월별 입사건수를 집계하는 쿼리문이다. SUM(DECODE) 구문은 월별 데이터를 가로로 집계할 때 많이 사용한다. SUM(DECODE) 구문을 사용하지 않는다면, 가로로 표시하는 로직이 애플리케이션단에서 처리해야 하기 때문에 프로그램이 조금 복잡해질 수 있다.
위의 월별 집계는 실무에서 아주 많이 사용하는 쿼리문이기 때문에 알아두면 아주 유용하게 사용할 수 있다.
SUM(DECODE) 구문이 이해가 아직 안 된다면, 아래의 포스팅을 참고하면 도움이 될 것이다.