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. Trong SQL Server bạn có thể sử dụng PIVOT
chức năng để chuyển đổi dữ liệu từ hàng để 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.
Nếu bạn có một số không rõ của columnnames
mà bạn muốn transpose, sau đó 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.
Nếu bạn không muốn sử dụng PIVOT
chức năng, sau đó bạn có thể sử dụng một chức năng tổng hợp với một biểu thức 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
Xem Demo.
Điều này cũng có thể được hoàn thành bằng cách sử dụng nhiều kết 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'
+1. . . Nhưng trong ví dụ cuối cùng, bạn có thể sử dụng 'cross join' thay vì' left join' vì mỗi truy vấn con trả về một hàng. –
Tôi cần tạo truy vấn động vì tôi không biết số hàng. Cho phép nói về việc chuyển đổi một bảng với 10.000.000 triệu bản ghi – tbag
@tbag Nếu bạn có một số hàng không xác định, thì bạn sẽ phải sử dụng sql động nhưng lưu ý rằng việc chuyển đổi hàng triệu hàng sẽ không hiệu quả. – Taryn