Bạn có thể sử dụng hàm UNPIVOT để chuyển đổi các cột thành các hàng:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
Lưu ý, các kiểu dữ liệu của các cột mà bạn không xoay vòng phải giống nhau để bạn có thể phải chuyển đổi các kiểu dữ liệu trước khi áp dụng unpOLL.
Bạn cũng có thể sử dụng CROSS APPLY
với UNION ALL để chuyển đổi các cột:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
select 'Indicator1', Indicator1 union all
select 'Indicator2', Indicator2 union all
select 'Indicator3', Indicator3 union all
select 'Indicator4', Indicator4
) c (indicatorname, indicatorvalue);
Tùy thuộc vào phiên bản SQL Server của bạn, bạn thậm chí có thể sử dụng CROSS ỨNG DỤNG với mệnh đề GIÁ TRỊ:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
Cuối cùng, nếu bạn có 150 cột để hủy xoay vòng và bạn không muốn mã hóa toàn bộ truy vấn, thì bạn có thể tạo câu lệnh sql bằng SQL động:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot
= stuff((select ','+quotename(C.column_name)
from information_schema.columns as C
where C.table_name = 'yourtable' and
C.column_name like 'Indicator%'
for xml path('')), 1, 1, '')
set @query
= 'select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in ('+ @colsunpivot +')
) u'
exec sp_executesql @query;