[SQL] 오라클 데이터를 컬럼으로 바꾸는 PIVOT

2023. 1. 31. 22:29DB/쿼리

728x90

 

 

PIVOT

 

- PIVOT

오라클에서 기본적으로 조회되는 세로 행의 데이터를 가로로 뒤집어서 조회되도록 함.

*좌측의 테이블구조를 우측의 테이블구조로 조회되도록 함.

SELECT 출력할 컬럼
FROM [PIVOT 대상 테이블]
PIVOT(
     [집계함수] FOR [컬럼(가로)으로 출력할 열] IN ([조건 대상 값])
);

--조건 대상값은 컬럼으로 출력할 열 내 존재하는 데이터여야 타깃데이터가 조회됨. (ALIAS 역할이 되기도 함)

*예제테이블(오라클 내에  SCOTT 계정 내 기본적으로 제공되는 EMP 테이블 사용)- 예제테이블 기본조회

SELECT DEPTNO
       , JOB
       , AVG(SAL) AS SAL
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;

 

- [목적] 아래와 같이 기본조회 세로로 출력되는 데이터를 가로로 컬럼화하여 조회하고자 할 경우

   예제테이블의 JOB컬럼 내 존재하는 데이터를 컬럼화하여 부서별 연봉의 평균을 조회

 

 

- PIVOT을 사용하지 않고 조회시

SELECT DEPTNO
       ,AVG (CASE WHEN DEPTNO='10' AND JOB='ANALYST' THEN SAL 
                 WHEN DEPTNO='20' AND JOB='ANALYST' THEN SAL  
                 WHEN DEPTNO='30' AND JOB='ANALYST' THEN SAL 
            END) AS ANALYST
       ,AVG (CASE WHEN DEPTNO='10' AND JOB='CLERK' THEN SAL 
                 WHEN DEPTNO='20' AND JOB='CLERK' THEN SAL  
                 WHEN DEPTNO='30' AND JOB='CLERK' THEN SAL 
            END) AS CLERK
       ,AVG (CASE WHEN DEPTNO='10' AND JOB='MANAGER' THEN SAL 
                 WHEN DEPTNO='20' AND JOB='MANAGER' THEN SAL  
                 WHEN DEPTNO='30' AND JOB='MANAGER' THEN SAL 
            END) AS MANAGER 
       ,AVG (CASE WHEN DEPTNO='10' AND JOB='PRESIDENT' THEN SAL 
                 WHEN DEPTNO='20' AND JOB='PRESIDENT' THEN SAL  
                 WHEN DEPTNO='30' AND JOB='PRESIDENT' THEN SAL 
            END) AS PRESIDENT 
       ,AVG (CASE WHEN DEPTNO='10' AND JOB='SALESMAN' THEN SAL 
                 WHEN DEPTNO='20' AND JOB='SALESMAN' THEN SAL  
                 WHEN DEPTNO='30' AND JOB='SALESMAN' THEN SAL 
            END) AS SALESMAN             
FROM EMP
GROUP BY DEPTNO

 

- PIVOT을 사용해서 조회

SELECT *
FROM ( SELECT DEPTNO, JOB, SAL FROM EMP )
PIVOT ( AVG(SAL) FOR JOB IN ('ANALYST','CLERK','MANAGER','PRESIDENT') )

 

PIVOT문에 가로로 출력할 컬럼은 가로로 나열할 때의 GROUP BY의 대상이 됨.

(위 PIVOT 사용 쿼리 내 JOB컬럼이 GROUP BY 되어 집계된 후 가로로 나열됨)

PIVOT문에 사용되지 않은 나머지 컬럼들은 세로로 나열할 때 GROUP BY의 대상이 됨.

(위 PIVOT 사용 쿼리 내 DEPTNO컬럼이 세로로 나열하는 GROUP BY 대상)

집계합수에 사용되는 대상 컬럼은 집계 대상이므로 제외하고 생각.

(위 PIVOT 사용 쿼리 내 SAL컬럼은 집계함수(AVG)의 대상)

 

 

728x90