SQL에서는 데이터를 보다 효과적으로 분석하고 시각화하기 위해 **행(Row)**과 열(Column) 사이의 변환 기능을 제공합니다.
이러한 변환 기능의 대표적인 예로 PIVOT과 UNPIVOT이 있으며, 이 글에서는 그 개념과 사용법, 예제, 그리고 두 기능의 차이점까지 자세히 정리해 보았습니다.
1. PIVOT
개념
PIVOT은 행 데이터를 열로 바꾸는 기능으로,
특정 컬럼의 값을 기준으로 열을 생성하고, 이 열들에 대해 집계 함수를 적용합니다.
복잡한 데이터도 보다 직관적으로 분석할 수 있도록 도와줍니다.
기본 문법 (Oracle 기준)
SELECT *
FROM (
SELECT ...
FROM 테이블명
)
PIVOT (
집계함수(대상컬럼)
FOR 피벗할컬럼 IN (값1, 값2, ...)
);
예제 1: 부서별 직무별 급여 합계 확인
SELECT *
FROM (
SELECT DEPTNO, JOB, SAL
FROM EMP
)
PIVOT (
SUM(SAL) FOR JOB IN ('CLERK' AS CLERK, 'MANAGER' AS MANAGER)
);
| DEPTNO | CLERK | MANAGER |
|---|
| 10 | 1300 | 2450 |
| 20 | NULL | 2975 |
| ... | ... | ... |
JOB 컬럼에 있는 값을 열로 바꾸고, 각 값에 대해 SAL 합계를 구함
예제 2: 월별 매출을 열로 변환
SELECT *
FROM (
SELECT YEAR, MONTH, SALES
FROM SALES_TABLE
)
PIVOT (
SUM(SALES) FOR MONTH IN (1 AS JAN, 2 AS FEB, 3 AS MAR)
);
| YEAR | JAN | FEB | MAR |
|---|
| 2023 | 100 | 200 | 150 |
2. UNPIVOT
개념
UNPIVOT은 PIVOT과 반대로, 열 데이터를 행으로 변환하는 기능입니다.
여러 열에 흩어진 데이터를 하나의 컬럼으로 모아, 행 형태로 나열하고 싶을 때 사용합니다.
기본 문법 (Oracle 기준)
SELECT *
FROM 테이블명
UNPIVOT (
대상컬럼 FOR 새컬럼명 IN (기존열1, 기존열2, ...)
);
예제 1: 월별 매출을 행으로 풀기
SELECT *
FROM (
SELECT YEAR, JAN, FEB, MAR
FROM SALES_PIVOT
)
UNPIVOT (
SALES FOR MONTH IN (JAN AS '1', FEB AS '2', MAR AS '3')
);
| YEAR | MONTH | SALES |
|---|
| 2023 | 1 | 100 |
| 2023 | 2 | 200 |
| 2023 | 3 | 150 |
예제 2: 과목별 성적을 행으로 정리
SELECT *
FROM (
SELECT STUDENT, KOR, ENG, MATH
FROM SCORE_TABLE
)
UNPIVOT (
SCORE FOR SUBJECT IN (KOR, ENG, MATH)
);
| STUDENT | SUBJECT | SCORE |
|---|
| A | KOR | 90 |
| A | ENG | 85 |
| A | MATH | 88 |
3. PIVOT vs UNPIVOT 비교
| 구분 | PIVOT | UNPIVOT |
|---|
| 변환 방향 | 행 → 열 | 열 → 행 |
| 사용 목적 | 데이터를 넓게 펼쳐 보기, 요약 집계용 | 데이터 정규화 및 열의 정보 행으로 보기 |
| 함수 필요 | 집계 함수 필수 (SUM, COUNT 등) | 별도의 집계 함수 필요 없음 |
| 활용 예시 | 월별 매출 요약, 부서별 급여 비교 | 과목별 성적, 월별 매출 데이터를 리스트 형태로 변환 |
마무리 정리
PIVOT은 데이터를 열로 정리해 보고자 할 때 유용합니다. 특히, 집계와 비교 분석에 탁월한 효과가 있습니다.
UNPIVOT은 여러 열을 하나의 열로 정규화하거나, 데이터 구조를 단순화하고자 할 때 유리합니다.
- 두 기능 모두 보고서, BI, ETL 처리 등 다양한 분석 및 데이터 처리 환경에서 활용됩니다.
- 사용하는 데이터베이스에 따라 문법이나 기능 차이가 있으므로, Oracle 외의 DB(MSSQL 등)를 사용할 경우 해당 DBMS의 문법을 확인하는 것이 중요합니다.