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

SQL Server의 여러 열에 대해 동적 피벗을 수행하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-03 16:06:39318검색

How to Perform Dynamic Pivoting on Multiple Columns in SQL Server?

SQL Server의 여러 열에 대한 동적 피벗

문제:

SQL Server에서, 열 이름이 변경될 수 있는 테이블의 여러 열에 대해 어떻게 동적 피벗을 수행할 수 있습니까? 미래?

해결책:

여러 열로 동적 피벗을 수행하려면 다음 단계를 따르세요.

1. 데이터 피벗 해제:

  • UNPIVOT 또는 CROSS APPLY를 사용하여 피벗하려는 열의 피벗을 해제합니다.
  • 이 예에서는 "전체" 및 "볼륨"의 피벗을 해제하려고 합니다. " 열:
select id, 
    col = cast(t_year as varchar(4))+'_'+t_type+'_'+col, 
    value
from ATM_TRANSACTIONS t
cross apply
(
    select 'total', total union all
    select 'volume', volume
) c (col, value);

2. PIVOT 함수 적용:

  • 피벗하려는 열 이름을 지정하여 피벗되지 않은 데이터에 PIVOT 함수를 적용합니다.
  • 이 경우에는 피벗하려는 열 이름을 지정합니다. 연도 및 유형:
select 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]
from
(
    select id, 
        col = cast(t_year as varchar(4))+'_'+t_type+'_'+col, 
        value
    from ATM_TRANSACTIONS t
    cross apply
    (
        select 'total', total union all
        select 'volume', volume
    ) c (col, value)
) d
pivot
(
    max(value)
    for col in ([2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume],
                [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volume])
) piv;

3. 동적 SQL로 변환:

  • 나중에 열 이름이 변경될 수 있는 경우 동적 피벗 T-SQL(예: sp_executesql)을 사용하여 위 쿼리를 동적 SQL로 변환할 수 있습니다.
  • 다음 동적 SQL 쿼리는 기존 테이블을 기반으로 PIVOT 문을 생성합니다. 구조:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(cast(t_year as varchar(4))+'_'+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, 
                    col = cast(t_year as varchar(4))+''_''+t_type+''_''+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 '

execute sp_executesql @query;

출력:

이렇게 하면 지정된 열로 피벗된 결과가 생성됩니다. 테이블의 데이터에 따라 결과가 달라질 수 있습니다.

위 내용은 SQL Server의 여러 열에 대해 동적 피벗을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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