행렬 변환 함수 PIVOT, UNPIVOT [MSSQL 가로 세로 변환, 행열변환]

2018. 6. 18. 10:06IT/MS-SQL

반응형

[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

반응형