Bạn có thể sử dụng hàm UNPIVOT để chuyển các cột thành 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 bạn đang hủy chia phải giống nhau, do đó bạn có thể phải chuyển đổi các kiểu dữ liệu trước khi áp dụng việc hủy chia.
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 ÁP DỤNG CROSS với mệnh đề VALUES:
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 cần giải nén và bạn không muốn viết mã cố định toàn bộ truy vấn, thì bạn có thể tạo câu lệnh sql bằng cách sử dụ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;