Điều này thực sự có thể được thực hiện khá dễ dàng với PIVOT
hàm số. Vì câu trả lời khác không hiển thị mã được liên kết với cách thực hiện nó, đây là hai cách để PIVOT
dữ liệu.
Đầu tiên là với Pivot tĩnh . Trụ tĩnh là khi bạn biết trước dữ liệu để chuyển thành cột.
select *
from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
)p
order by jobid, name
Cách thứ hai là sử dụng PIVOT động để xác định tại thời điểm chạy các giá trị để chuyển thành cột.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101))
from test
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, id, ' + @cols + ', jobid from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in (' + @cols + ')
) p
order by jobid, name'
execute(@query)
Cả hai sẽ tạo ra cùng một kết quả. Dynamic hoạt động hiệu quả khi bạn không biết trước các giá trị để chuyển đổi thành cột.