Ada beberapa cara untuk mengubah data dari banyak 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 tidak diketahui columnnames
Jika Anda memiliki jumlah yang tidak diketahui columnnames
yang ingin Anda transpos, 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 bisa 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 banyak gabungan
Ini juga dapat diselesaikan menggunakan beberapa gabungan, tetapi Anda akan memerlukan beberapa kolom untuk mengaitkan setiap baris yang tidak Anda miliki dalam data sampel Anda. Tetapi 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'
cross join
daripadaleft join
karena setiap subquery mengembalikan satu baris.