PIVOT과 UNPIVOT은 SQL에서 데이터를 행(row)과 열(column) 간 변환하는 기능을 제공하는 절입니다.
- PIVOT: 행 데이터를 열로 변환
- UNPIVOT: 열 데이터를 행으로 변환
이 기능은 MSSQL, Oracle 등 일부 RDBMS에서 지원하며,
MySQL과 PostgreSQL에서는 CASE WHEN
또는 GROUP BY
등을 사용하여 유사한 기능을 구현할 수 있습니다.
1. PIVOT 절 (행 → 열 변환)
PIVOT은 특정 열의 고유한 값을 새로운 컬럼으로 변환하는 기능을 합니다.
📌 PIVOT 기본 문법 (MSSQL 기준)
SELECT *
FROM (원본 테이블)
PIVOT (
집계함수(집계할 컬럼)
FOR 피벗할 컬럼 IN (변환할 컬럼1, 변환할 컬럼2, ...)
) AS 별칭;
✅ 예제: 직원별 연도별 급여 데이터 변환
📌 원본 테이블 (salaries)
emp_id | year | salary |
---|---|---|
101 | 2021 | 50000 |
101 | 2022 | 55000 |
102 | 2021 | 60000 |
102 | 2022 | 65000 |
📌 PIVOT 적용
SELECT *
FROM (SELECT emp_id, year, salary FROM salaries) AS src
PIVOT (
SUM(salary) FOR year IN ([2021], [2022])
) AS pvt;
📌 변환 결과
emp_id | 2021 | 2022 |
---|---|---|
101 | 50000 | 55000 |
102 | 60000 | 65000 |
✅ 각 연도를 새로운 컬럼으로 변환하여 출력
2. UNPIVOT 절 (열 → 행 변환)
UNPIVOT은 여러 열을 하나의 행으로 변환하는 기능을 합니다.
📌 UNPIVOT 기본 문법 (MSSQL 기준)
SELECT *
FROM (변환할 테이블)
UNPIVOT (
변환할 컬럼 FOR 컬럼명 IN (컬럼1, 컬럼2, ...)
) AS 별칭;
✅ 예제: PIVOT 변환된 데이터 되돌리기
📌 기존 변환된 테이블
emp_id | 2021 | 2022 |
---|---|---|
101 | 50000 | 55000 |
102 | 60000 | 65000 |
📌 UNPIVOT 적용
SELECT emp_id, year, salary
FROM (SELECT emp_id, [2021], [2022] FROM salaries) AS src
UNPIVOT (
salary FOR year IN ([2021], [2022])
) AS unpvt;
📌 변환 결과
emp_id | year | salary |
---|---|---|
101 | 2021 | 50000 |
101 | 2022 | 55000 |
102 | 2021 | 60000 |
102 | 2022 | 65000 |
✅ 원래의 행 기반 데이터로 복원됨
3. MySQL 및 PostgreSQL에서 PIVOT/UNPIVOT 구현
MySQL과 PostgreSQL에는 PIVOT/UNPIVOT 절이 없으므로 CASE WHEN
또는 GROUP BY
를 활용하여 유사한 변환을 수행합니다.
✅ PIVOT 구현 (MySQL, PostgreSQL)
SELECT
emp_id,
SUM(CASE WHEN year = 2021 THEN salary END) AS "2021",
SUM(CASE WHEN year = 2022 THEN salary END) AS "2022"
FROM salaries
GROUP BY emp_id;
✅ UNPIVOT 구현 (MySQL, PostgreSQL)
SELECT emp_id, '2021' AS year, "2021" AS salary FROM salaries
UNION ALL
SELECT emp_id, '2022', "2022" FROM salaries;
✅ PIVOT과 UNPIVOT을 CASE WHEN
, UNION ALL
을 사용하여 구현 가능
4. PIVOT과 UNPIVOT 비교
기능 | 설명 | 주요 사용 사례 |
---|---|---|
PIVOT | 행 데이터를 열로 변환 | 연도별, 카테고리별 집계 데이터 |
UNPIVOT | 열 데이터를 행으로 변환 | 정규화(Normalization), 데이터 분석 |
5. 결론
- PIVOT은 행을 열로 변환, UNPIVOT은 열을 행으로 변환하는 기능.
- MSSQL, Oracle에서 기본 제공하며, MySQL, PostgreSQL에서는
CASE WHEN
과UNION ALL
을 활용. - 대량의 데이터에서 사용할 경우 성능 최적화 필요.