복수 칼럼 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] - [MSSQL] 동적 PIVOT, 동적 UNPIVOT (dynamic pivot/unpivot)
하지만 이번에 적용해볼 것은 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
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] GROUP BY COUNT (NULL 포함 집계) (0) | 2021.02.24 |
---|---|
[MSSQL] XML 문자 파싱 오류 (XML 구문 분석: 잘못된 xml 문자입니다.) (0) | 2021.01.11 |
[MSSQL] TRIM/RTRIM/LTRIM 문자열 공백 및 지정 문자 제거 (0) | 2020.09.19 |
[MSSQL] GETDATE 날짜함수 (YEAR, MONTH, DAY) (0) | 2020.09.16 |
[MSSQL] SELECT DISTINCT가 지정된 경우에는 ORDER BY 항목이 SELECT 목록에 나타나야 합니다. (0) | 2020.07.20 |