행렬 변환 함수 PIVOT, UNPIVOT [MSSQL 가로 세로 변환, 행열변환]
[MSSQL] 행렬 변환 함수 PIVOT, UNPIVOT
# PIVOT
아래와 같이 학생이름, 과목, 점수가 반영된 테이블이 있다고 가정하면
WITH TABLE_A (이름, 과목, 점수) AS (
SELECT '철수', '국어', 90 UNION ALL
SELECT '철수', '영어', 85 UNION ALL
SELECT '영희', '국어', 70 UNION ALL
SELECT '영희', '영어', 80 )
SELECT * FROM TABLE_A
- 조회 값
이름 | 과목 | 점수 |
철수 | 국어 | 90 |
철수 | 영어 | 85 |
영희 | 국어 | 70 |
영희 | 영어 | 80 |
이 테이블에 대하여 과목별 학생의 점수 합을 구하고 싶다면? 아래와 같이 MSSQL에서 재공하는 PIVOT을 사용 한다.
ex) 과목별 점수 구하기
WITH TABLE_A (이름, 과목, 점수) AS (
SELECT '철수', '국어', 90 UNION ALL
SELECT '철수', '영어', 85 UNION ALL
SELECT '영희', '국어', 70 UNION ALL
SELECT '영희', '영어', 80 )
SELECT * FROM TABLE_A
PIVOT(SUM(점수) FOR 이름 IN (철수,영희)) AS PVT
- 결과 값
과목 | 철수 | 영희 |
국어 | 90 | 70 |
영어 | 85 | 80 |
이렇게 조회가 된다.
위 식을 복사해서 사용해 보면 이해하기가 쉽다.
# UNPIVOT
아래와 같이 학생이름, 과목, 점수가 반영된 테이블이 있다고 가정하면
WITH TABLE_A (이름, 국어, 영어) AS (
SELECT '철수', '90', '80' UNION ALL
SELECT '영희', '85', '100' )
SELECT * FROM TABLE_A
- 조회 값
이름
국어
영어
철수
90
80
영희
85
100
ex) 이름에 과목별로 점수를 구하고 싶을 경우
WITH TABLE_A (이름, 국어, 영어) AS (
SELECT '철수', '90', '80' UNION ALL
SELECT '영희', '85', '100' )
SELECT 이름, 과목, 점수 FROM TABLE_A
UNPIVOT(점수 FOR 과목 IN (영어))AS UNPVT
union all
SELECT 이름, 과목, 점수 FROM TABLE_A
UNPIVOT(점수 FOR 과목 IN (국어))AS UNPVT
-- union all 을 사용한 이유는?
-- 원래는 UNPIVOT(점수 FOR 과목 IN (국어, 영어))AS UNPVT 이렇게 사용하면 영어 국어에 대한 내용이 나오는데 에러가 나서 그냥 union all 을 사용해 버렸다.
-- 에러 수정하면 다시 올리도록 하겠다. 물론 에러가 발생한 이유도 같이 올리도록 하겠다!!
- 결과 값
이름
과목
점수
철수
영어
80
영희
영어
100
철수
국어
90
영희
국어
85