2018. 6. 18. 10:06ㆍIT/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
'IT > MS-SQL ' 카테고리의 다른 글
MSSQL 한글 자동 전환 문제 해결!! (1) | 2019.03.15 |
---|---|
MSSQL Alter Table / 테이블 컬럼 추가 (0) | 2018.12.14 |
MSSQL DATABASE 백업 DB 만들기 / 테스트 DB 만들기 (0) | 2017.11.09 |
MSSQL 특수문자 LIKE 조회하기 Escape 사용하기 _%#&- 등 조회 (0) | 2017.11.08 |
[MSSQL] 예외처리, exists 사용법 (0) | 2017.05.04 |