본문 바로가기

프로그래밍/MSSQL

[MSSQL] PIVOT, UNPIVOT (행렬 변환)

반응형

 

 

행렬 변환 함수 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

 

 

 

반응형