PIVOT과 UNPIVOT은 SQL에서 데이터를 행(row)과 열(column) 간 변환하는 기능을 제공하는 절입니다.
이 기능은 MSSQL, Oracle 등 일부 RDBMS에서 지원하며,
MySQL과 PostgreSQL에서는 CASE WHEN
또는 GROUP BY
등을 사용하여 유사한 기능을 구현할 수 있습니다.
PIVOT은 특정 열의 고유한 값을 새로운 컬럼으로 변환하는 기능을 합니다.
SELECT *
FROM (원본 테이블)
PIVOT (
집계함수(집계할 컬럼)
FOR 피벗할 컬럼 IN (변환할 컬럼1, 변환할 컬럼2, ...)
) AS 별칭;
emp_id | year | salary |
---|---|---|
101 | 2021 | 50000 |
101 | 2022 | 55000 |
102 | 2021 | 60000 |
102 | 2022 | 65000 |
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 |
✅ 각 연도를 새로운 컬럼으로 변환하여 출력
UNPIVOT은 여러 열을 하나의 행으로 변환하는 기능을 합니다.
SELECT *
FROM (변환할 테이블)
UNPIVOT (
변환할 컬럼 FOR 컬럼명 IN (컬럼1, 컬럼2, ...)
) AS 별칭;
emp_id | 2021 | 2022 |
---|---|---|
101 | 50000 | 55000 |
102 | 60000 | 65000 |
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 |
✅ 원래의 행 기반 데이터로 복원됨
MySQL과 PostgreSQL에는 PIVOT/UNPIVOT 절이 없으므로 CASE WHEN
또는 GROUP BY
를 활용하여 유사한 변환을 수행합니다.
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;
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
을 사용하여 구현 가능
기능 | 설명 | 주요 사용 사례 |
---|---|---|
PIVOT | 행 데이터를 열로 변환 | 연도별, 카테고리별 집계 데이터 |
UNPIVOT | 열 데이터를 행으로 변환 | 정규화(Normalization), 데이터 분석 |
CASE WHEN
과 UNION ALL
을 활용.윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…