Convertir efficacement des lignes en colonnes

Convertir efficacement des lignes en colonnes

Il existe plusieurs façons de transformer des données de plusieurs lignes en colonnes.

Utilisation de PIVOT

Dans SQL Server, vous pouvez utiliser la fonction PIVOT pour transformer les données de lignes en colonnes :

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

Voir la Démo.

Pivot avec un nombre inconnu de columnnames

Si vous avez un nombre inconnu de columnnames que vous souhaitez transposer, vous devez utiliser du SQL dynamique :

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName)
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot
            (
                max(value)
                for ColumnName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

Voir la Démo.

Utilisation d’une fonction d’agrégation

Si vous ne souhaitez pas utiliser la fonction PIVOT, vous pouvez utiliser une fonction d’agrégation avec une expression CASE :

select
  max(case when columnname = 'FirstName' then value end) Firstname,
  max(case when columnname = 'Amount' then value end) Amount,
  max(case when columnname = 'PostalCode' then value end) PostalCode,
  max(case when columnname = 'LastName' then value end) LastName,
  max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable

Voir la Démo.

Utilisation de jointures multiples

Cela pourrait également être réalisé en utilisant

(Réponse tronquée)