[Oracle] 행을 열로 바꾸는 3가지 방법 (세로를 가로로)
- 데이터베이스/오라클
- 2023. 1. 7.
오라클에서 행을 열로 바꾸기 위해서는 다양한 방법이 있다. 그룹별로 집계된 데이터의 행을 열로 바꾸기 위해서는 PIVOT, DECODE 또는 CASE를 사용하며, 여러 행의 문자열을 합쳐서 하나의 열로 바꾸기 위해서는 LISTAGG 함수를 사용하면 된다. 아래의 예제를 참고하면 쉽게 이해할 수 있을 것이다.
목차 |
PIVOT 함수를 사용하여 행을 열로 변환
SELECT deptno
, p_president
, p_analyst
, p_manager
, p_salesman
, p_clerk
FROM (
SELECT deptno
, job
, sal
FROM emp
)
PIVOT (
SUM(sal) FOR job IN ( 'PRESIDENT' AS p_president
, 'ANALYST' AS p_analyst
, 'MANAGER' AS p_manager
, 'SALESMAN' AS p_salesman
, 'CLERK' AS p_clerk )
)
오라클 11g부터 PIVOT 함수를 사용하여 행을 열로 변환할 수 있다.
기존 GROUP BY 절을 사용하여 행으로 출력된 값을 PIVOT 함수로 열로 변환한다고 생각하면 된다.
DECODE, CASE 표현식을 사용하여 행을 열로 변환
SELECT deptno
, SUM(DECODE(job, 'PRESIDENT', sal)) AS p_president
, SUM(DECODE(job, 'ANALYST', sal)) AS p_analyst
, SUM(DECODE(job, 'MANAGER', sal)) AS p_manager
, SUM(DECODE(job, 'SALESMAN', sal)) AS p_salesman
, SUM(DECODE(job, 'CLERK', sal)) AS p_clerk
FROM emp
GROUP BY deptno
ORDER BY deptno
PIVOT 함수를 사용하여 행을 열로 변환하듯이 DECODE 함수를 사용하여 동일한 결과를 출력할 수 있다.
PIVOT 함수는 오라클 11g 이상에서만 사용가능 하지만, DECODE 함수는 모든 버전에서 사용가능 하다.
CASE 표현식을 사용하여 행을 열로 변환
SELECT deptno
, SUM(CASE WHEN job = 'PRESIDENT' THEN sal END) AS p_president
, SUM(CASE WHEN job = 'ANALYST' THEN sal END) AS p_analyst
, SUM(CASE WHEN job = 'MANAGER' THEN sal END) AS p_manager
, SUM(CASE WHEN job = 'SALESMAN' THEN sal END) AS p_salesman
, SUM(CASE WHEN job = 'CLERK' THEN sal END) AS p_clerk
FROM emp
GROUP BY deptno
ORDER BY deptno
CASE 연산자를 사용하는 방법은 표준 SQL 이기 때문에 오라클 외에도 대부분의 DB에서 사용할 수 있다.
LISTAGG 함수를 사용하여 행을 열로 변환
SELECT job
, LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS names
FROM emp
GROUP BY job
오라클 11g R2부터 LISTAGG 함수를 사용하여 행의 문자열을 하나의 열로 합칠 수 있다.
오라클 11g R2 이전의 버전은 XMLAGG, WM_CONCAT 함수를 사용하면 된다.
여러 행의 문자열을 하나의 열로 합치는 예제이다.