개발/sqld
[SQL/2과목] PIVOT절과 UNPIVOT절
2ivii
2025. 8. 22. 23:10
이번에는 PIVOT과 UNPIVOT에 대해 알아보겠다.

PIVOT
PIVOT은 행을 열로 바꾸는 기능이다. 여러 행에 걸쳐있는 데이터를 하나의 행에 여러열로 펼치는 것이다. 구문을 봐보자
SELECT 컬럼목록
FROM (
SELECT 원본컬럼들
FROM 테이블명
)
PIVOT (
집계함수(값컬럼)
FOR 기준컬럼 IN (
'값1' AS 새컬럼1,
'값2' AS 새컬럼2,
...
)
);
FROM절에서, PIVOT할 원래 데이터를 선택한다
그리고 PIVOT에서 집계할 값을 선택하고, 열로 만들 컬럼과 값을 지정해준다. 바로 예시를 보는게 나을듯하다! 아래는 테이블과 구문이다.
| salesperson | quater | amount |
| 김철수 | Q1 | 400 |
| 김철수 | Q1 | 50 |
| 김철수 | Q2 | 550 |
| 이영희 | Q1 | 500 |
| 이영희 | Q2 | 600 |
| 이영희 | Q2 | 100 |
SELECT *
FROM sales_log
PIVOT (
SUM(amount)
FOR quarter IN ('Q1' AS 1분기, 'Q2' AS 2분기)
);
PIVOT을 살피면 amount의 합으로 데이터를 집계하고,
quater을 기준으로 Q1은 1분기로, Q2는 2분기로 새 컬럼으로 지정했다. 그럼 이제 새 컬럼별로 amount가 집계돼서 아래와 같은 행과 열이 바뀐 새로운 테이블이 생긴다!
| salesperson | 1분기 | 2분기 |
| 김철수 | 450 | 550 |
| 이영희 | 500 | 700 |
UNPIVOT
얘는 열을 행으로 바꾸는 것이다. 반대로 수행되는것이다!
구문은 비슷하다. 근데 좀 반대이다.
SELECT 컬럼목록
FROM (
SELECT 원본컬럼들
FROM 테이블명
)
UNPIVOT (
값을 담을 새 컬럼
FOR 열 이름을 담을 새 컬럼 IN (
행으로 변환할 원본 열1 AS '값1',
행으로 변환할 원본 열2 AS '값2',
...
)
);
보면 FOR 전에는 이제 새 컬럼이 오고, IN 뒤에는 원본열들이 온다.
| student_name | korean | english | math |
| 김철수 | 90 | 85 | 95 |
| 이영희 | 75 | 92 | 88 |
SELECT
student_name,
subject,
score
FROM
student_scores
UNPIVOT (
score
FOR subject IN (korean, english, math)
);
| student_name | subject | scroe |
| 김철수 | KOREAN | 90 |
| 김철수 | ENGLISH | 85 |
| 김철수 | MATH | 95 |
| 이영희 | KOREAN | 75 |
| 이영희 | ENGLISH | 92 |
| 이영희 | MATH | 88 |
이렇게, score이란 새로운 컬럼에 이제 값을 담고, IN 뒤에 행들을 넣은 것들은 값들이 돼서 새 컬럼 안에 들어있다~
우하하 확실히 내맘대로 정리하니까 이해가 된다.. 읽는 사람은 이해 안되겠지만... 그래도 이제 문제를 풀러 가볼것이다 !!