PIVOT 절과 UNPIVOT 절

PIVOTUNPIVOT은 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_idyearsalary
101202150000
101202255000
102202160000
102202265000

📌 PIVOT 적용

SELECT *
FROM (SELECT emp_id, year, salary FROM salaries) AS src
PIVOT (
SUM(salary) FOR year IN ([2021], [2022])
) AS pvt;

📌 변환 결과

emp_id20212022
1015000055000
1026000065000

각 연도를 새로운 컬럼으로 변환하여 출력

2. UNPIVOT 절 (열 → 행 변환)

UNPIVOT은 여러 열을 하나의 행으로 변환하는 기능을 합니다.

📌 UNPIVOT 기본 문법 (MSSQL 기준)

SELECT * 
FROM (변환할 테이블)
UNPIVOT (
변환할 컬럼 FOR 컬럼명 IN (컬럼1, 컬럼2, ...)
) AS 별칭;

✅ 예제: PIVOT 변환된 데이터 되돌리기

📌 기존 변환된 테이블

emp_id20212022
1015000055000
1026000065000

📌 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_idyearsalary
101202150000
101202255000
102202160000
102202265000

원래의 행 기반 데이터로 복원됨

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 WHENUNION ALL을 활용.
  • 대량의 데이터에서 사용할 경우 성능 최적화 필요.

Leave a Comment