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

오라클에서 행을 열로 바꾸기 위해서는 다양한 방법이 있다. 그룹별로 집계된 데이터의 행을 열로 바꾸기 위해서는 PIVOT, DECODE 또는 CASE를 사용하며, 여러 행의 문자열을 합쳐서 하나의 열로 바꾸기 위해서는 LISTAGG 함수를 사용하면 된다. 아래의 예제를 참고하면 쉽게 이해할 수 있을 것이다.

 

목차
  1. PIVOT 함수를 사용하여 행을 열로 변환
  2. DECODE, CASE 표현식을 사용하여 행을 열로 변환
  3. 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 함수를 사용하면 된다.

 

 

여러 행의 문자열을 하나의 열로 합치는 예제이다.

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

 

 

[Oracle] PIVOT 함수 사용법

오라클 11g부터 PIVOT 기능을 제공합니다. 기존 이하버전에서는 DECODE 함수를 이용하여 로우를 컬럼으로 변경하는 작업을 하였습니다. PIVOT 기능을 이용하면 DECODE의 복잡하고 비직관적인 코드를 조

gent.tistory.com

 

[Oracle] LISTAGG 함수 사용법

오라클에서 여러 행의 컬럼 값을 하나로 합치기 위해서는 XMLAGG(오라클 9i 이하), WM_CONCAT(오라클 10g~11g R1) 함수를 사용하였다. 오라클 11g R2 버전부터 WM_CONCAT 함수를 사용을 할 수 없으며 LISTAGG 함

gent.tistory.com

 

[Oracle] XMLAGG, WM_CONCAT 함수 사용법

오라클에서 GROUP BY 절과 SUM 함수를 사용하여 숫자를 합산할 수 있다. 그러나 문자열인 경우 SUM 함수를 사용하여 문자열을 합칠 수는 없고 대신에 LISTAGG, XMLAGG, WM_CONCAT 함수를 사용하여 그룹별 문

gent.tistory.com

 

댓글

Designed by JB FACTORY