SQL PIVOT / UNPIVOT 정리

박우진·2025년 5월 29일

SQLD

목록 보기
12/12

SQL에서는 데이터를 보다 효과적으로 분석하고 시각화하기 위해 **행(Row)**과 열(Column) 사이의 변환 기능을 제공합니다.
이러한 변환 기능의 대표적인 예로 PIVOTUNPIVOT이 있으며, 이 글에서는 그 개념과 사용법, 예제, 그리고 두 기능의 차이점까지 자세히 정리해 보았습니다.


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)
);
DEPTNOCLERKMANAGER
1013002450
20NULL2975
.........

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)
);
YEARJANFEBMAR
2023100200150

2. UNPIVOT

개념

UNPIVOTPIVOT과 반대로, 열 데이터를 행으로 변환하는 기능입니다.
여러 열에 흩어진 데이터를 하나의 컬럼으로 모아, 행 형태로 나열하고 싶을 때 사용합니다.


기본 문법 (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')
);
YEARMONTHSALES
20231100
20232200
20233150

예제 2: 과목별 성적을 행으로 정리

SELECT *
FROM (
    SELECT STUDENT, KOR, ENG, MATH
    FROM SCORE_TABLE
)
UNPIVOT (
    SCORE FOR SUBJECT IN (KOR, ENG, MATH)
);
STUDENTSUBJECTSCORE
AKOR90
AENG85
AMATH88

3. PIVOT vs UNPIVOT 비교

구분PIVOTUNPIVOT
변환 방향행 → 열열 → 행
사용 목적데이터를 넓게 펼쳐 보기, 요약 집계용데이터 정규화 및 열의 정보 행으로 보기
함수 필요집계 함수 필수 (SUM, COUNT 등)별도의 집계 함수 필요 없음
활용 예시월별 매출 요약, 부서별 급여 비교과목별 성적, 월별 매출 데이터를 리스트 형태로 변환

마무리 정리

  • PIVOT은 데이터를 열로 정리해 보고자 할 때 유용합니다. 특히, 집계와 비교 분석에 탁월한 효과가 있습니다.
  • UNPIVOT은 여러 열을 하나의 열로 정규화하거나, 데이터 구조를 단순화하고자 할 때 유리합니다.
  • 두 기능 모두 보고서, BI, ETL 처리 등 다양한 분석 및 데이터 처리 환경에서 활용됩니다.
  • 사용하는 데이터베이스에 따라 문법이나 기능 차이가 있으므로, Oracle 외의 DB(MSSQL 등)를 사용할 경우 해당 DBMS의 문법을 확인하는 것이 중요합니다.

0개의 댓글