Có một số cách để bạn có thể chuyển đổi dữ liệu từ nhiều hàng thành cột.
Sử dụng PIVOT
Trong SQL Server, bạn có thể sử dụng PIVOT
chức năng chuyển đổi dữ liệu từ hàng thành cột:
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;
Xem Demo.
Xoay vòng với số lượng columnnames
không xác định
Nếu bạn có một số lượng columnnames
không xác định mà bạn muốn chuyển đổi, thì bạn có thể sử dụng SQL động:
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;
Xem Demo.
Sử dụng hàm tổng hợp
Nếu bạn không muốn sử dụng PIVOT
thì bạn có thể sử dụng một hàm tổng hợp với CASE
biểu thức:
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
Xem Demo.
Sử dụng nhiều phép nối
Điều này cũng có thể được hoàn thành bằng cách sử dụng nhiều phép nối, nhưng bạn sẽ cần một số cột để liên kết từng hàng mà bạn không có trong dữ liệu mẫu của mình. Nhưng cú pháp cơ bản sẽ là:
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'