IT/DB

[MSSQL] 다중 칼럼 PIVOT, 동적 PIVOT, 동적 UNPIVOT

Dev. Sean 2022. 5. 4. 09:21
반응형

PIVOT 연산자는 행으로 나열되어 있는 데이터를 열로 가공하는 것이다.

 

요구 사항 상, 한줄 컬럼 PIVOT이 아닌 다중컬럼,

또 행 데이터가 RANK 연산자로 인해 가변값들이었기 때문에

동적 UNPIVOT을 사용해야했다.

DECLARE @QUERY 		VARCHAR(MAX);
DECLARE @STRCOLUMN	VARCHAR(MAX);
DECALRE @KEYCOLUMN  VARCHAR(MAX);

-- 생략하였지만 위에서 이미 만들어준 #SERVICEACCEPT라는 테이블이 있다.
/* RANK 연산자에 의해서 #SERVICEACCEPT ROW 데이터들이 변하기 때문에
   이 값들을 @STRCOLUMN에 [],[],[], 형태로 담아준다.
*/

SET	@STRCOLUMN = STUFF((SELECT '],[' + SERVICENAME FROM #SERVICEACCEPT FOR XML PATH('')) + ']',1,1,'');
SET @STRCOLUMN = RIGHT(@STRCOLUMN, LEN(@STRCOLUMN)-1);

--위에서 담았던 ROW 데이터들을 컬럼으로 만들고 기존에 컬럼이었던 SR, CR,계 를 행으로 피봇.
SET @QUERY = '
				SELECT [구분],' + @STRCOLUMN + '
                FROM (
                		SELECT SERVICENAME, 구분, CNT
                        FROM #SERVICEACCEPT A
                        UNPIVOT([CNT] FOR [구분] IN ([SR],[CR],[계])) AS UNPVT) T
                        PIVOT(SUM([CNT]) FOR [SERVICENAME] IN ('+@STRCOLUMN+')) AS PVT
                        ORDER BY (CASE WHEN 구분 = ''SR'' THEN 0 WHEN 구분 = ''CR'' THEN 1
                        ELSE 2 END 
                        )'
                        
EXEC(@QUERY)

 

반응형