Ada beberapa cara untuk mengubah data dari beberapa baris menjadi kolom.
Menggunakan PIVOT
Di SQL Server Anda dapat menggunakan PIVOT
fungsi untuk mengubah data dari baris ke kolom:
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;
Lihat Demo.
Pivot dengan jumlah columnnames
yang tidak diketahui
Jika Anda memiliki nomor columnnames
yang tidak diketahui yang ingin Anda transpose, maka Anda dapat menggunakan SQL dinamis:
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;
Lihat Demo.
Menggunakan fungsi agregat
Jika Anda tidak ingin menggunakan PIVOT
fungsi, maka Anda dapat menggunakan fungsi agregat dengan CASE
ekspresi:
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
Lihat Demo.
Menggunakan beberapa gabungan
Ini juga dapat diselesaikan dengan menggunakan beberapa gabungan, tetapi Anda akan memerlukan beberapa kolom untuk mengaitkan setiap baris yang tidak Anda miliki dalam data sampel Anda. Tapi sintaks dasarnya adalah:
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'