본문 바로가기

프로그래밍/MSSQL

[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 함수를 이용해서 행과 열을 바꿔줬다.

 

 

※ PIVOT에 대해 더 자세히 알고 싶다면 아래의 글들을 참고하세요.

 

[프로그래밍/MSSQL] - [MSSQL] PIVOT, UNPIVOT (행렬 변환)

 

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

행렬 변환 함수 PIVOT, UNPIVOT PIVOT 행렬 변환 SELECT 컬럼명 FROM 테이블명 PIVOT([집계함수]([집계컬럼명]) FOR [대상컬럼명] IN ([컬럼이될값])) AS 피벗테이블명 집계함수 : SUM(합계), AVG(평균), COUNT(..

ggmouse.tistory.com

[프로그래밍/MSSQL] - [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

 

 

하지만 이번에 적용해볼 것은 1개의 열에 대한 행/열 변환이 아닌, 다중 열에 대한 변환이다.

 

원본

 

위와 같이 각 회사별로 고객, 종업원, 매니저의 수가 데이터로 있다.

 

처음 설명에서는 고객의 수만을 기준으로 행/열 변환을 했지만, 실제로 내가 원하는 데이터는 고객, 종업원, 매니저 수 모두에 해당한다.

 

즉, 다음과 같은 결과를 원한다.

 

원하는 결과

 

 

 

 

1단계. PIVOT 처리할 데이터 나열

 

1단계는 UNPIVOT 혹은 CROSS APPLY를 이용해서 처리할 수 있다.

 

 

첫 번째 방법. UNPIVOT 이용

 

SELECT COMPANY, PART, CNT
FROM TBL_COMPANY_STATS A
UNPIVOT([CNT] FOR [PART] IN ([CLIENT_CNT], [EMPLOYEE_CNT], [MANAGER_CNT]))AS UNPVT

 

 

두 번째 방법. CROSS APPLY

 

SELECT COMPANY, PART, CNT
FROM (
SELECT 
	COMPANY
	, SUM([CLIENT_CNT]) CLIENT
	, SUM([EMPLOYEE_CNT]) EMPLOYEE
	, SUM([MANAGER_CNT]) MANAGER
FROM TBL_COMPANY_STATS
GROUP BY COMPANY
) RES
CROSS APPLY (
	SELECT 'CLIENT_CNT', CLIENT UNION ALL
	SELECT 'EMPLOYEE_CNT', EMPLOYEE UNION ALL
	SELECT 'MANAGER_CNT', MANAGER
) C (PART, CNT);

 

결과

 

 

 

2단계. 데이터 출력

 

1단계를 통해 나열한 데이터를 이제 다시 PIVOT 처리해주면 원하는 데이터 결과가 나오게 된다.

 

가독성을 위해 1단계에서 수행한 데이터를 임시 테이블에 넣어서 처리하거나,

FROM절에 1단계 쿼리를 그대로 넣어준다.

 

 

첫 번째 방법. 임시 테이블에 저장 후 데이터 출력

 

SELECT COMPANY, PART, CNT INTO #TEMP_TABLE
FROM TBL_COMPANY_STATS A
UNPIVOT([CNT] FOR [PART] IN ([CLIENT_CNT], [EMPLOYEE_CNT], [MANAGER_CNT]))AS UNPVT

SELECT [PART], [A], [B], [C], [D]
FROM #TEMP_TABLE
PIVOT(SUM([CNT]) FOR [COMPANY] IN ([A], [B], [C], [D])) AS PVT

DROP TABLE #TEMP_TABLE

 

 

두 번째 방법. 서브 쿼리를 이용해 FROM에 그대로 작성

 

SELECT [PART], [A], [B], [C], [D]
FROM (
	SELECT COMPANY, PART, CNT 
	FROM TBL_COMPANY_STATS A
	UNPIVOT([CNT] FOR [PART] IN ([CLIENT_CNT], [EMPLOYEE_CNT], [MANAGER_CNT]))AS UNPVT
) T
PIVOT(SUM([CNT]) FOR [COMPANY] IN ([A], [B], [C], [D])) AS PVT

 

최종 결과

 

 

 

 

반응형