2016-12-08 3 views
1

J'ai une requête qui génère dynamiquement un nombre différent de lignes, avec des valeurs de colonne d'ID variables. Je dois pouvoir PIVOT ceci dans un résultat columnar. Mon résultat de données actuel est ci-dessous.Essayer de faire pivoter plusieurs colonnes dans T-SQL

ID Caption FieldName  FieldType 
--- --------- ------------ ------------ 
10 Caption 1 Field Name 1 Field Type 1 
11 Caption 2 Field Name 2 Field Type 2 
12 Caption 3 Field Name 3 Field Type 3 
20 Caption 4 Field Name 4 Field Type 4 
30 Caption 5 Field Name 5 Field Type 5 

Mon résultat souhaité est

10   11   12   20   30 
--------  ---------- ---------  ---------  --------- 
Caption 1  Caption 2  Caption 3  Caption 4  Caption 5 
Field Name 1 Field Name 2 Field Name 3 Field Name 4 Field Name 5 
Field Type 1 Field Type 2 Field Type 3 Field Type 4 Field Type 5 

S'il vous plaît noter que les valeurs 10, 11, 12, 20 et 30 peuvent changer d'être quelque chose d'autre, alors je comprends que je dois faire un peu sql dynamique . Je veux éviter d'utiliser CURSEURS si possible.

Toutes les suggestions sont les bienvenues. S'il vous plaît excuser la mise en forme

+1

Si vous comprenez que vous devez faire une sql dynamique, pourquoi ne pas inclure le code que vous avez déjà essayé dans le poste ? – dfundako

+0

J'ai seulement regardé un autre message pour comprendre que je dois faire, mais je ne suis pas sûr de la façon de coller mon code ici. Le @ me donne une erreur quand essaye de coller du code .. – gsva

+0

Je ne suis même pas sûr si celui-ci peut s'appeler PIVOT. Il semble que vous essayez de transposer la table. – DVT

Répondre

0

2005 Version

Declare @SQL varchar(max) 
Select @SQL = stuff((Select Distinct ',' + QuoteName(ID)+'=max(case when Item='+cast(ID as varchar(25))+' then Value else null end)' From YourTable Order By 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],'[email protected] +' 
From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply ( 
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Group By Seq 
Order By Seq 
' 
Exec(@SQL); 

Retours

enter image description here

0

Si vous ne me dérange pas d'aller dynamique

Je hésite à supprimer SEQ (la première colonne des résultats). Vous pouvez supprimer [SEQ], de la requête finale, mais je ne suis pas sûr qu'il conserverait la séquence appropriée sur un ensemble de données plus volumineux.

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(ID) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Seq],' + @SQL + ' 
    From (
     Select Item=A.ID,B.* 
     From YourTable A 
     Cross Apply (
         Select Seq=1,Value=cast(A.Caption as varchar(max)) Union All 
         Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All 
         Select Seq=3,Value=cast(A.FieldType as varchar(max)) 
        ) B 
     ) A 
Pivot (max(value) For Item in (' + @SQL + ')) p' 
Exec(@SQL); 

Retours

enter image description here

EDIT - Avec SEQ Retiré de la finale Sélectionnez

enter image description here

+0

Les résultats sont ce que je veux, mais j'obtiens une erreur de syntaxe en utilisant le code ci-dessus. Il me donne une erreur de syntaxe nouvelles Valeurs – gsva

+0

Cela dépend. Je reçois une liste de champs affichés sur une page. J'essaye de créer un manuscrit générique, de sorte que ceci produise dans un format qui peut être exporté pour exceler. Ces feuilles Excel peuvent ensuite être remplies avec des données pour tester l'automatisation. Le nombre de ces champs peut varier de 10-60 – gsva

+0

Avant la génération de la sortie que j'ai énumérée ci-dessus pour le pivotement, je fais beaucoup de manipulation en ajoutant ou supprimant certains champs en fonction de certaines conditions. Ainsi, la colonne ID ne peut pas toujours les mêmes valeurs de page à page – gsva