Votre sortie désirée est pas très clair, mais vous pouvez utiliser la fois la UNPIVOT
et PIVOT
fonction pour obtenir le résultat
Si vous connaissez le nombre de colonnes, vous pouvez coder en dur les valeurs:
select *
from
(
select id,
'Instance'+cast(instance as varchar(10))+'_'+col col,
value
from
(
select id,
Instance,
Name,
cast(Size as varchar(50)) Size,
Tech
from yourtable
) x
unpivot
(
value
for col in (Name, Size, Tech)
) u
) x1
pivot
(
max(value)
for col in
([Instance0_Name], [Instance0_Size], [Instance0_Tech],
[Instance1_Name], [Instance1_Size], [Instance1_Tech],
[Instance2_Name], [Instance2_Size], [Instance2_Tech],
[Instance3_Name], [Instance3_Size], [Instance3_Tech])
) p
Voir SQL Fiddle with Demo
Alors si vous avez un nombre inconnu de valeurs, vous pouvez utiliser SQL dynamique:
DECLARE @query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsPivot = STUFF((SELECT ','
+ quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name)
from yourtable t
cross apply sys.columns as C
where C.object_id = object_id('yourtable') and
C.name not in ('id', 'instance')
group by t.instance, c.name
order by t.instance
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select *
from
(
select id,
''Instance''+cast(instance as varchar(10))+''_''+col col,
value
from
(
select id,
Instance,
Name,
cast(Size as varchar(50)) Size,
Tech
from yourtable
) x
unpivot
(
value
for col in (Name, Size, Tech)
) u
) x1
pivot
(
max(value)
for col in ('+ @colspivot +')
) p'
exec(@query)
Voir SQL Fiddle with Demo
Si le résultat est correct, alors s'il vous plaît modifier votre OP et poster le résultat que vous attendez de deux Ids que vous avez fourni.
Voulez-vous que le 'ID' soit affiché dans le résultat final? Vous avez différents 'ID 'alors lequel voulez-vous? – Taryn
Je viens de réaliser cela.Merci de le signaler. – Rodricks
Souhaitez-vous que chacune des valeurs «ID» séparées figure sur une ligne distincte avec toutes les instances associées à cet ID pivotées? Cela finirait par avoir l'air vraiment moche comme un résultat puisque le nommage est basé sur la valeur de l'instance et les valeurs d'instance semblent être uniques. Cela conduirait à une valeur par colonne et NULL pour toutes les instances auxquelles elle ne s'applique pas sur la ligne. Selon la taille de l'ensemble de données, vous risquez de rencontrer un problème de limitation de colonne. –