[SQL] 오라클 컬럼을 데이터로 바꾸는 UNPIVOT

2023. 2. 2. 22:03DB/쿼리

728x90

 

 

UNPIVOT

 

- UNPIVOT

오라클에서 가로 행의 데이터를 세로로 출력

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

 

- UNPIVOT 사용방법

 'UNPIVOT 대상 테이블' 에서 기존 컬럼(속성)이  UNPIVOT시에는 데이터화되어 가로(로우)로 조회됨.

 어떤 컬럼들을 조회할지 'IN' 절에 명시해야함.

 'IN' 절에 명시되는 속성들은 모두 동일한 타입이어야함 (UNION ALL과 동일한 원리).

 'FOR' 다음에는 'IN'절에서 명시한 컬럼을 조회시 어떤 명으로 조회될지 별칭을 지정.

 'FOR' 전에는 'IN'절에서 명시한 컬럼의 실제 데이터가 조회될 때 어떤 명으로 조회될지 별칭을 지정

SELECT *
FROM (
	[UNPIVOT 대상 테이블]
)
UNPIVOT [IN절에 명시할 컬럼의 실데이터를 나타낼 별칭]
        FOR [IN절에 명시할 컬럼데이터를 나타낼 별칭]
        IN ( [세로로 표시될 컬럼명] )
)

--IN절에 명시된 컬럼만 데이터화되어 조회됨
--IN절에 명시되지 않은 컬럼은 기본 컬럼 그대로 조회됨

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

SELECT 
        ENAME
       , JOB 
       , MGR
       , HIREDATE
FROM EMP
ORDER BY ENAME;

 

- [목적] 기존 컬럼데이터로 출력되던 데이터를 세로로 돌려 로우데이터로 출력

ENAME별로 그에 상응하는 속성명, 속성값을 조회

 

- UNPIVOT을 사용하지 않고 UNION ALL을 사용한 조회

SELECT 
        ENAME
       , 'JOB'  as 속성명
       ,  JOB   as 속성값
FROM EMP 
UNION  ALL
SELECT 
        ENAME
       , 'MGR'  	as 속성명
       ,  TO_CHAR(MGR)  as 속성값
FROM EMP
UNION  ALL
SELECT 
        ENAME
       , 'HIREDATE'  	    as 속성명
       ,  TO_CHAR(HIREDATE) as 속성값
FROM EMP
ORDER BY ENAME, 속성명

 

- UNPIVOT을 사용한 조회

SELECT *
FROM (
SELECT 
    ENAME
    ,JOB 
    ,TO_CHAR(MGR) AS MGR
    ,TO_CHAR(HIREDATE) AS HIRE_DT
FROM EMP
)
UNPIVOT (
    속성값 FOR 속성명 IN (JOB, MGR, HIRE_DT)
)
ORDER BY ENAME, 속성명
728x90