>데이터 베이스 >MySQL 튜토리얼 >SQL Server에서 여러 열을 동적으로 피벗하는 방법은 무엇입니까?

SQL Server에서 여러 열을 동적으로 피벗하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-02 13:46:43755검색

How to Dynamically Pivot Multiple Columns in SQL Server?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.