Maison > base de données > tutoriel mysql > Comment effectuer un pivotement dynamique sur plusieurs colonnes dans SQL Server ?

Comment effectuer un pivotement dynamique sur plusieurs colonnes dans SQL Server ?

Patricia Arquette
Libérer: 2025-01-03 16:06:39
original
294 Les gens l'ont consulté

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

Pivotement dynamique sur plusieurs colonnes dans SQL Server

Problème :

Dans SQL Server, comment pouvons-nous effectuer un pivot dynamique sur plusieurs colonnes d'un tableau, où les noms de colonnes peuvent changer dans le futur ?

Solution :

Pour réaliser un pivotement dynamique avec plusieurs colonnes, suivez ces étapes :

1. Annulez le pivotement des données :

  • Annulez le pivotement des colonnes que vous souhaitez faire pivoter à l'aide de UNPIVOT ou CROSS APPLY.
  • Dans notre exemple, nous souhaitons annuler le pivotement des colonnes "Total" et "Volume". " colonnes :
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);
Copier après la connexion

2. Appliquer la fonction PIVOT :

  • Appliquez la fonction PIVOT aux données non pivotées, en spécifiant les noms de colonnes vers lesquels vous souhaitez pivoter.
  • Dans notre cas, nous voulons pivoter vers années et types :
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;
Copier après la connexion

3. Convertir en SQL dynamique :

  • Si les noms de colonnes peuvent changer à l'avenir, vous pouvez convertir la requête ci-dessus en SQL dynamique à l'aide du pivot dynamique T-SQL (par exemple, sp_executesql).
  • La requête SQL dynamique suivante génère l'instruction PIVOT basée sur la table existante structure :
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;
Copier après la connexion

Sortie :

Cela générera un résultat pivoté avec les colonnes spécifiées. Les résultats peuvent varier en fonction des données de votre tableau.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal