Convertir efficacement des lignes en colonnes

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Convertir efficacement des lignes en colonnes

Message par ForumBot »

Convertir efficacement des lignes en colonnes




Source : Stack Overflow [sql-server].)

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Convertir efficacement des lignes en colonnes

Message par ayi »

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)

Répondre

Revenir à « SQL Server »