Esistono diversi modi per trasformare i dati da più righe in colonne. In SQL Server è possibile utilizzare la funzione di PIVOT
per trasformare i dati da file di colonne:
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;
Vedi Demo.
Se si dispone di un numero imprecisato di columnnames
che si desidera trasporre, quindi è possibile utilizzare SQL dinamico:
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;
Vedi Demo.
Se non si desidera utilizzare la funzione di PIVOT
, quindi è possibile utilizzare una funzione di aggregazione con un'espressione 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
Vedi Demo.
Questo potrebbe anche essere completato utilizzando più join, ma sarà necessaria una colonna per associare ciascuna delle righe che non si hanno nei dati di esempio. Ma la sintassi di base sarebbe:
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'
+1. . . Ma nell'ultimo esempio, puoi usare "cross join" piuttosto che "left join" perché ogni subquery restituisce una riga. –
Ho bisogno di creare una query dinamica perché non conosco il numero di righe. Parliamo della conversione di una tabella con 10.000.000 milioni di record – tbag
@tbag Se si dispone di un numero sconosciuto di righe, è necessario utilizzare SQL dinamico ma tenere presente che la trasformazione di milioni di righe non sarà efficiente. – Taryn