행렬 변환 함수 PIVOT, UNPIVOT
PIVOT
행렬 변환
SELECT 컬럼명
FROM 테이블명
PIVOT([집계함수]([집계컬럼명]) FOR [대상컬럼명] IN ([컬럼이될값])) AS 피벗테이블명
집계 함수 : SUM(합계), AVG(평균), COUNT(개수), MAX/MIN(최대/최소)
예제
PIVOT을 적용하여 행렬을 변환해보자
WITH TABLE_A (학년, 반, 점수) AS (
SELECT '1학년', '1반', 100 UNION ALL
SELECT '1학년', '2반', 30 UNION ALL
SELECT '2학년', '1반', 80 UNION ALL
SELECT '2학년', '2반', 90
)
SELECT * FROM TABLE_A
원본 데이터가 보기 불편하니, 아래와 같이 눈에 쉽게 들어오도록 행렬을 변환하고 싶다.
|
1반 |
2반 |
1학년 |
|
|
2학년 |
|
|
PIVOT을 이용하여 다음과 같이 쿼리를 작성해보자
WITH TABLE_A (학년, 반, 점수) AS (
SELECT '1학년', '1반', 100 UNION ALL
SELECT '1학년', '2반', 30 UNION ALL
SELECT '2학년', '1반', 80 UNION ALL
SELECT '2학년', '2반', 90
)
SELECT *
FROM TABLE_A
PIVOT(SUM(점수) FOR 반 IN ([1반],[2반])) AS PVT
이렇게 조금 더 보기 편하게 결과를 볼 수 있도록 행렬을 변경해줬다.
SUM(점수) : 점수를 집계할 거야
FOR 반 IN ([1반], [2반]) : 반 칼럼의 있는 1반, 2반 데이터를 칼럼으로 변경
자 근데 여기서 SUM의 역할은 무엇이었을까?
단순히 행렬이 바뀐 거 말고는 데이터의 변화가 없어 보인다.
하지만! 사실상 SUM으로 점수가 합계 처리된 것이다.
다른 예제 데이터로 이를 증명해보자
예제 2
이렇게 학년을 제외한 반, 점수만 들어있는 테이블에서 PIVOT을 적용시켜보자
WITH TABLE_A (반, 점수) AS (
SELECT '1반', 100 UNION ALL
SELECT '2반', 30 UNION ALL
SELECT '1반', 80 UNION ALL
SELECT '2반', 90
)
SELECT *
FROM TABLE_A
PIVOT(SUM(점수) FOR 반 IN ([1반],[2반])) AS PVT
결과 데이터를 보면 알 수 있듯이,
반을 가로(COLUMN)로 변경하고, 점수의 합계가 세로(ROW)가 된다.
UNPIVOT
PIVOT의 반대 개념이다.
SELECT 컬럼명
FROM 테이블
UNPIVOT([집계될 데이터의 컬럼명] FOR [UNPIVOT할 컬럼 데이터의 컬럼명] IN ([UNPIVOT할 컬럼명])) AS 언피벗테이블명
예제
위의 예제에서 PIVOT으로 행렬을 변환시켜 아래의 결과를 얻었다.
다시 이를 반대로 즉, PIVOT 전의 결과로 되돌려보자.
WITH TABLE_A ([학년], [1반], [2반]) AS (
SELECT '1학년', 100, 30 UNION ALL
SELECT '2학년', 80, 90
)
SELECT [학년], [반], [점수]
FROM TABLE_A
UNPIVOT([점수] FOR 반 IN ([1반], [2반]))AS UNPVT
[MSSQL] 동적 PIVOT, 동적 UNPIVOT (dynamic pivot/unpivot)
[MSSQL] 동적 PIVOT, 동적 UNPIVOT (dynamic pivot/unpivot)
[MSSQL] PIVOT, UNPIVOT (행렬 변환) PIVOT / UNPIVOT PIVOT 과 UNPIVOT -- PIVOT SELECT 컬럼명 FROM 테이블명 PIVOT([집계 함수]([집계 컬럼명]) FOR [대상 컬럼명] IN ([컬럼이 될 값])) AS 피벗테이블명 -- U..
ggmouse.tistory.com
[MSSQL] 다중 칼럼 PIVOT 처리 (복수개의 열 행렬 변환)
[MSSQL] 다중 칼럼 PIVOT 처리 (복수개의 열 행렬 변환)
복수 칼럼 PIVOT 처리 먼저, 기본 PIVOT에 대해 간단히 알아보자 SELECT [A], [B], [C], [D] FROM TBL_COMPANY_STATS PIVOT(SUM(CLIENT_CNT) FOR COMPANY IN ([A], [B], [C], [D])) AS PVT 이렇게 PIVOT 함수를..
ggmouse.tistory.com
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] ' (따옴표) 포함된 문자열 출력 (0) | 2017.02.13 |
---|---|
[MSSQL] 조건절 LIKE 검색 조건 (ESCAPE 특수문자 와일드 카드 (예약어) 검색) (0) | 2017.02.13 |
[MSSQL] DATENAME, DATEPART (요일, 올해 몇번째 날, 주말을 제외한 평일 일수) (0) | 2017.02.09 |
[MSSQL] PARTITION BY 테이블 분할 함수 (0) | 2017.02.09 |
[MSSQL] COMPUTE (별도의 결과 집합으로 출력) (0) | 2016.07.11 |