오라클 함수인 Pivot 및 Unpivot 기능은 Oracle 11g 버전부터 제공하는 강력한 함수이다. 피봇함수는 행을 열로 뒤집는 함수지만, 언피봇함수는 열을 행으로 뒤집는 함수다. 이러한 강력한 함수가 지원되기 이전에는 decode, case문을 이용해서 행 또는 열을 뒤집어야 했다. 언피봇 함수는 약간의 제약사항과 룰만 지켜주면 훌륭한 함수로 사용할 수 있다. 본 포스팅에서 주의하길 바라는 키워드는 컬럼명, 데이터 영역이다. 각 용어들에 대해서 반복적으로 자주 사용할 것이다.

 

 


 

오라클(Oracle) 피봇(Pivot) 사용 방법 그룹핑 개념으로: http://wookoa.tistory.com/240

 


 

 

설명에 사용할 예시 데이터는 오라클에서 교육용으로 제공해주는 EMP 테이블이며, 자세한 데이터는 아래와 같다. EMP 테이블은 인터넷에 검색만해도 스크립트를 쉽게 얻을 수 있다.

 

 

EMP 테이블을 구했다면 추가적으로 테이블을 좀 손봐야 한다. 위에서 언급한 EMP 테이블을 그대로 사용할 경우 이해가 어렵다. 그렇기 때문에 With 절을 사용해서 필요한 컬럼만 추려내본다.

 

'SELECT ENAME, SAL FROM EMP'

 

 

위의 결과 테이블을 이제부터 뒤집을 것이다. 언피봇의 결과가 여러가지 모습으로 상상되지만, 아래와 같이 통째로 기울여진 모습으로 상상하면 곤란하다.

 

언피봇의 결과는 아래와 같이 네모친 부분의 컬럼명데이터 영역이 열에서 행으로 뒤집어지는 형태이다. 컬럼명이 데이터 영역으로 들어와 있다. 여기서 우리는 각각을 컬럼명, 데이터 영역으로 부르기로 한다. 

 

 

언피봇의 구문은 아래의 사진과 같이 UNPIVOT, UNPIVOT FOR, UNPIVOT IN 총 3개의 절이 필요하다.

각 절의 의미에 대해서 알아가면서 하나씩 적용해 볼 것이다.

 

 

-. UNPIVOT 절: 데이터 영역의 컬럼을 정의

언피봇을 사용할때 열을 행으로 변경할 컬럼명과 데이터 영역을 선정해야 한다. 선정한 컬럼명과 데이터 영역은 행으로 변환되어 각각의 컬럼명을 지니게 된다. 그때 데이터 영역의 컬럼명을 지정해주는 곳이 UNPIVOT 절이다. 아래의 사진과 같이 데이터 영역의 컬럼명이 선언 되었다. 본인은 UNPIVOT 절에 'DATA'를 입력했다.

 

 

 

-. UNPIVOT FOR 절: 컬럼명 영역의 컬럼을 정의

UNPIVOT 절을 이해했다면 UNPIVOT FOR 절은 껌이다. 언피봇을 수행하면 컬럼명이 데이터 영역으로 들어왔을 것이다. 그때 필요한 컬럼명을 정의해주면 된다. 본인은 아래의 사진과 같이 UNPIVOT 절에 'COL'을 입력했다.

 

 

 

-. UNPIVOT IN 절: 데이터 영역으로 들어올 컬럼명을 정의

UNPIVOT FOR 절을 이해했다면 UNPIVOT IN 절도 껌이다. 데이터 영역으로 들어올 컬럼명을 정의해주면 된다. 아래의 예제 사진의 경우 SAL 컬럼이 데이터 영역으로 들어온 경우다. 본인의 경우 UNPIVOT IN 절에 '(SAL)'을 입력했다.

 

 

 

지금까지 내용을 정리해보자면 결과적으로 각각의 절에 아래와 같이 입력했다.

SAL 컬럼을 데이터 영역으로 넣고, 각각의 컬럼명을 COL, DATA로 넣어주세요 "

 

 

여기까지가 언피봇에 대한 이야기의 끝이다. 이제 언피봇 함수를 읽어 내리는데 큰 어려움이 없을 것이라 믿는다.

추가로 연습해 보자면, UNPIVOT IN 절에 숫자 데이터 형식의 컬럼을 두개 넣은 예제는 아래와 같다. IN절에 정의한 컬럼들이 COL 컬럼안에 다 들어갔으며, 널값은 표현되지 않았다.

 

 

 

 

조금 더 심화적으로, 아래의 예제는 JOB 컬럼과 SAL 컬럼을 활용해서 직업별 월급의 합계를 UNPIVOT한 결과다. With 절의 데이터를 JOB, SAL로 정제한 뒤, UNPIVOT된 결과를 GROUP BY를 활용했다.

 

 

 

 

비교적 쉬운 방법으로 접근하려고 노력했다. 야심찬 마음으로 포스팅을 작성했지만, 본인이 전달하려고한 내용이 잘 전달되었는지 걱정이다. 오랜시간 고민하고 작성한 UNPIVOT 함수에 대한 가이드 포스팅을 이로써 마무리 짓도록 한다.

 

 

Private comment