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

zerg96

Recent Posts

SQLD 핵심 개념, NULL·JOIN·윈도우 함수 8문제로 정리

SQLD에서 점수를 가르는 건 어려운 이론보다 NULL 처리, 조인 조건 위치, 윈도우 함수의 동작 같은…

3시간 ago

AI 때문에 디자이너 일자리 절반이 사라진다 — 지금 당장 바꿔야 할 것들

AI 이미지 생성 도구의 폭발적 보급으로 그래픽·콘텐츠 디자이너 일감이 실제로 줄고 있습니다. 어떤 직군이 먼저…

4시간 ago

전기차 소프트웨어 전쟁, 현대차가 테슬라를 이길 수 있을까

전기차 시장이 배터리 싸움에서 소프트웨어 전쟁으로 전환됐다. 테슬라의 AI·데이터 해자 vs 현대차의 SDV 전략, 진짜…

9시간 ago

미국 9월 생산자물가 1.3% 급등, 그런데 뉴욕증시는 올랐다: 10월 16일 간밤 시황

어제 미국에서 9월 생산자물가지수(PPI)가 나왔는데 숫자가 꽤 거칠었습니다. 그런데 간밤 뉴욕증시 3대 지수는 모두 올랐습니다.…

9시간 ago

9월 가계대출 9개월 만에 2.2조 감소, 신용대출 3조가 줄고 주담대는 3.3조 늘었다

가계대출이 오랜만에 줄었다는 소식에 대출 문턱이 낮아지는 거냐고 묻는 분들이 많습니다. 금융당국이 10월 15일 발표한…

10시간 ago

뉴욕은 올랐는데 코스피는 7.57% 폭락 마감, 오늘(16일) 개장 전 체크할 4가지

어제 코스피가 하루에 7% 넘게 빠졌다는 소식, 아침에 확인하고 놀라신 분들 많으실 텐데요. 그런데 밤사이…

10시간 ago