반응형
PostgreSQL에서 Pivot과 Unpivot은 데이터를 행(row) 또는 열(column) 기준으로 변환하는 작업을 의미한다.
이 작업은 주로 데이터 분석과 시각화를 준비하는 단계에서 사용되며, Pivot과 Unpivot을 활용하는 일이 종종 있어 작성하고자 한다.
이를 작성하는 이유는 PostgreSQL은 Unpivot을 지원하는 전용 함수가 없기 때문이다.

1. 1. Pivot
행 데이터를 열 데이터로 변환
예제 - 각 제품별 매출을 월별로 정리하기
아래 테이블이 sales라는 테이블이며, 데이터는 아래와 같이 되어 있다고 가정해보자.
month | product | price |
January | A | 100000 |
January | B | 150000 |
February | A | 120000 |
February | B | 140000 |
이 데이터를 Pivot하면 아래과 같은 SQL을 사용하면 된다.
<sql />
SELECT month
, MAX(CASE WHEN product = 'A' THEN price ELSE 0 END) AS A
, MAX(CASE WHEN product = 'B' THEN price ELSE 0 END) AS B
FROM sales
GROUP BY month
ORDER BY month ASC
;
결과
month | A | B |
January | 100000 | 150000 |
February | 120000 | 140000 |
2. 02. Unpivot
열 데이터를 행 데이터로 변환
예제
위에서 Pivot 결과 데이터를 다시 원래 형태로 변환한다면 아래와 같이 작업하면 된다.
Pivot 데이터
month | A | B |
January | 100000 | 150000 |
February | 120000 | 140000 |
이를 Unpivot 하려면 다음과 같은 SQL을 활용하기 (UNNEST(ARRAY))
<sql />
SELECT month
, UNNEST(ARRAY['A', 'B']) AS product
, UNNEST(ARRAY[A, B]) AS price
FROM (
SELECT month
, A
, B
FROM sales_pivot
) AS pivoted_data
;
3. 결과
month | product | price |
January | A | 100000 |
January | B | 150000 |
February | A | 120000 |
February | B | 140000 |
4. 정리
- Pivot: CASE 또는 FILTER를 사용하여 행 데이터를 열로 변환
- Unpivot: UNNEST 또는 UNION ALL을 사용하여 열 데이터를 행으로 변환
반응형
'Data Engineering > DBMS' 카테고리의 다른 글
[PostgreSQL] 서브 쿼리(Sub Query)의 개념 & 문법 (1) | 2024.12.19 |
---|---|
[MySQL] MySQL 이벤트 스케줄러 (Event Scheduler) (0) | 2023.11.19 |
[PostgreSQL] Database Partitioning (0) | 2023.08.23 |
[DB 기초] 트랜잭션(Transaction)과 그 특성은 무엇인가 (0) | 2023.08.19 |
[DBMS] Data structure store Redis (0) | 2023.07.27 |