Bạn đang cố gắng PIVOT
dữ liệu. Máy chủ SQL có PIVOT
chức năng có thể thực hiện điều này cho bạn. Để thực hiện PIVOT
bạn cần quyết định sử dụng hàm tổng hợp nào. Trong mẫu của tôi, tôi đã sử dụng MAX()
nhưng bạn có thể sử dụng SUM()
, v.v.
Nếu bạn không có hàm pivot thì bạn có thể sử dụng hàm tổng hợp với CASE
tuyên bố để thực hiện điều này.
Phiên bản tổng hợp / CASE: Phiên bản này yêu cầu bạn viết mã cố định tất cả các tên vào các cột.
select
max(case when name = 'Engineering' then rating end) Engineering,
max(case when name = 'Financials' then rating end) Financials,
max(case when name = 'Scope' then rating end) Scope,
max(case when name = 'Schedule' then rating end) Schedule,
max(case when name = 'Risks' then rating end) Risks,
max(case when name = 'People' then rating end) People
from yourtable
Phiên bản PIVOT tĩnh: Bạn sẽ cố gắng mã hóa các giá trị của tên vào truy vấn này
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
Các phiên bản trên hoạt động tốt nếu bạn có một số lượng cột đã biết, nhưng nếu name
của bạn giá trị không xác định, thì bạn có thể sử dụng sql động để PIVOT
dữ liệu.
Phiên bản PIVOT động:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select name, rating
from yourtable
) x
pivot
(
max(rating)
for name in (' + @cols + ')
) p '
execute(@query)
Cả ba phiên bản sẽ tạo ra cùng một kết quả:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |