집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server에서 여러 열을 동적으로 피벗하는 방법은 무엇입니까?
이 문서에서는 Microsoft의 여러 열에 대한 동적 피벗 작업을 수행하는 문제에 대해 설명합니다. SQL 서버. 목표는 지정된 열의 고유 값을 나타내는 행과 다른 열의 값을 나타내는 열을 사용하여 데이터를 피벗 테이블 형식으로 변환하는 것입니다.
피벗 작업을 수행하기 전에 데이터는 피벗 해제되어야 합니다. 이 프로세스는 여러 열을 행으로 변환하여 데이터의 모양을 변경합니다. 이 경우 Total 및 Volume 컬럼은 언피벗됩니다.
SELECT ID, CONCAT(T_YEAR, '_', T_TYPE, '_', COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', TOTAL UNION ALL SELECT 'volume', VOLUME ) c (COL, VALUE)
데이터가 언피벗되면 동적 피벗 쿼리를 생성할 수 있습니다. 이 쿼리는 피벗되지 않은 데이터를 기반으로 피벗 테이블에 필요한 열을 동적으로 작성합니다.
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONCAT(T_YEAR, '_', T_TYPE, '_', COL)) FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', 1 UNION ALL SELECT 'volume', 2 ) c (COL, SO) GROUP BY COL, SO, T_TYPE, T_YEAR ORDER BY T_YEAR, T_TYPE, SO FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); SET @query = 'SELECT ID,' + @cols + ' FROM ( SELECT ID, CONCAT(T_YEAR, ''_''+T_TYPE+''_''+COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT ''total'', TOTAL UNION ALL SELECT ''volume'', VOLUME ) c (COL, VALUE) ) x PIVOT ( MAX(VALUE) FOR COL IN (' + @cols + ') ) p ';
동적 쿼리는 sp_executesql 저장 프로시저를 사용하여 실행됩니다. 이 절차는 동적 SQL 코드에 의해 생성된 쿼리를 가져와 실행합니다.
EXECUTE SP_EXECUTESQL @QUERY;
동적 피벗 작업의 출력은 행과 열로 고유한 ID 값을 갖는 피벗 테이블입니다. T_YEAR 및 T_TYPE의 각 조합에 대한 피벗되지 않은 총계 및 거래량 값을 나타냅니다. 결과는 다음과 같습니다.
ID | 2008_A_TOTAL | 2008_A_VOLUME | 2008_B_TOTAL | 2008_B_VOLUME | 2008_C_TOTAL | 2008_C_VOLUME | 2009_A_TOTAL | 2009_A_VOLUME | 2009_B_TOTAL | 2009_B_VOLUME | 2009_C_TOTAL | 2009_C_VOLUME |
---|---|---|---|---|---|---|---|---|---|---|---|---|
DD1 | 1000 | 10 | 2000 | 20 | 3000 | 30 | 4000 | 40 | 5000 | 50 | 6000 | 60 |
DD2 | 7000 | 70 | 8000 | 80 | 9000 | 90 | 10000 | 100 | 11000 | 110 | 12000 | 120 |
위 내용은 SQL Server에서 여러 열을 동적으로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!