Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir efficacement les lignes en colonnes dans SQL Server

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

Utiliser PIVOT

Dans SQL Server, vous pouvez utiliser le PIVOT fonction 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 pouvez utiliser le 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.

Utiliser une fonction d'agrégation

Si vous ne souhaitez pas utiliser le PIVOT fonction, alors vous pouvez utiliser une fonction d'agrégation avec un CASE expression :

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.

Utiliser plusieurs jointures

Cela peut également être effectué à l'aide de plusieurs jointures, mais vous aurez besoin d'une colonne pour associer chacune des lignes que vous n'avez pas dans vos exemples de données. Mais la syntaxe de base serait :

select fn.value as FirstName,
  a.value as Amount,
  pc.value as PostalCode,
  ln.value as LastName,
  an.value as AccountNumber
from yourtable fn
left join yourtable a
  on fn.somecol = a.somecol
  and a.columnname = 'Amount'
left join yourtable pc
  on fn.somecol = pc.somecol
  and pc.columnname = 'PostalCode'
left join yourtable ln
  on fn.somecol = ln.somecol
  and ln.columnname = 'LastName'
left join yourtable an
  on fn.somecol = an.somecol
  and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'