2013-01-08 1 views
0

J'ai un Table1:dynamique Pivot (ligne à colonnes)

ID Instance Name Size Tech 
1 0  D1 123 ABC 
1 1  D2 234 CDV 
2 2  D3 234 CDV 
2 3  D4 345 SDF 

J'ai besoin ResultSet à l'aide dynamique PIVOT pour ressembler avec les en-têtes:

ID | Instance0_Name | Instance0_Size | Instance0_Tech | Instance1_Name | Instance1_Size | Instance1_tech 
1 | D1    | 123   | ABC   | D2    | 234   | CDV 

Toute aide serait appréciée. en utilisant Sql Server 2008.

Désolé pour le post précédent.

+0

Voulez-vous que le 'ID' soit affiché dans le résultat final? Vous avez différents 'ID 'alors lequel voulez-vous? – Taryn

+0

Je viens de réaliser cela.Merci de le signaler. – Rodricks

+0

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. –

Répondre

5

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.

Questions connexes