개발/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 뒤에 행들을 넣은 것들은 값들이 돼서 새 컬럼 안에 들어있다~

 
우하하 확실히 내맘대로 정리하니까 이해가 된다.. 읽는 사람은 이해 안되겠지만... 그래도 이제 문제를 풀러 가볼것이다 !!