คุณสามารถใช้ฟังก์ชันUNPIVOTเพื่อแปลงคอลัมน์เป็นแถว:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
โปรดทราบว่าประเภทข้อมูลของคอลัมน์ที่คุณกำลังยกเลิกการใช้งานต้องเหมือนกันดังนั้นคุณอาจต้องแปลงประเภทข้อมูลก่อนที่จะใช้การไม่ได้ใช้งาน
คุณยังสามารถใช้CROSS APPLY
กับ UNION ALL เพื่อแปลงคอลัมน์:
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);
ขึ้นอยู่กับเวอร์ชันของ SQL Server ของคุณคุณสามารถใช้ CROSS APPLY กับส่วนคำสั่ง VALUES:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
สุดท้ายหากคุณมี 150 คอลัมน์ที่จะยกเลิกการใช้งานและคุณไม่ต้องการฮาร์ดโค้ดคิวรีทั้งหมดคุณสามารถสร้างคำสั่ง sql โดยใช้ไดนามิก SQL:
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;