Vous pouvez utiliser le UNPIVOT pour convertir les colonnes en lignes :
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
Notez que les types de données des colonnes que vous dépivotez doivent être les mêmes. Il se peut donc que vous deviez convertir les types de données avant d'appliquer le dépiquage.
Vous pouvez également utiliser CROSS APPLY
avec UNION ALL pour convertir les colonnes :
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);
En fonction de votre version de SQL Server, vous pouvez même utiliser CROSS APPLY avec la clause VALUES :
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
Enfin, si vous avez 150 colonnes à déplier et que vous ne voulez pas coder en dur l'ensemble de la requête, vous pouvez générer l'instruction SQL à l'aide de SQL dynamique :
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;