2017-02-16 1 views
1

J'ai besoin de générer des données en tant que jeu de résultats à partir d'une procédure stockée dans laquelle les colonnes de mes données sources sont représentées en tant que lignes dans la sortie. Je devrais voir une ligne pour chaque colonne dans ma sortie qui est dans mes données source et je devrais voir une colonne dans ma sortie pour chaque ligne dans mes données source. Je ne vois pas comment je peux le faire en utilisant Pivot ou les autres méthodes que j'ai examinées. Une fois que j'ai les données orientées comme je l'aime, j'imagine que je vais interroger sys.columns pour injecter les noms des colonnes de données source comme la première colonne de ma sortie. J'aurai aussi probablement besoin d'interroger les valeurs de données sources à l'avance qui seront utilisées comme noms de colonnes de sortie. J'imagine un SQL dynamique magnifique dans mon futur mais je peux trier tout cela moi-même si nécessaire. Je suis surtout préoccupé par la façon de convertir les colonnes en lignes. Voir ci-dessous:Déplacement de colonnes SQL vers des lignes

SELECT 
    ID 
    ,XID 
    ,Amount 
FROM (
     SELECT 11 as ID, 301 as XID, 50001 as Amount UNION ALL 
     SELECT 12 as ID, 302 as XID, 50002 as Amount UNION ALL 
     SELECT 13 as ID, 303 as XID, 50003 as Amount UNION ALL 
     SELECT 14 as ID, 304 as XID, 50004 as Amount 
    ) T1 
/* 
The above query returns this: 

ID XID Amount 
---------------- 
11 301 50001 
12 302 50002 
13 303 50003 
14 304 50004 


Instead I would like to see this: 

Column 11  12  13  14 
----------------------------------- 
ID  11  12  13  14 
XID  301 302 303 304 
Amount 50001 50002 50003 50004 

*/ 
+3

Check out PIVOT: https://technet.microsoft.com/en- us/library/ms177410 (v = sql.105) .aspx – Leonidas199x

+0

Ceci est un peu le contraire de ce que vous voulez, mais il shou ld vous dirige dans la bonne direction http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server –

+0

En utilisant PIVOT vous pouvez faire en sorte que la valeur source de la colonne ID soit représente une colonne pour chaque ID dans la sortie, mais vous ne pouvez pas faire en sorte que le reste des colonnes source soit représenté en tant que lignes. Je ne vois pas comment faire ce que je veux avec PIVOT. – RedRocketFire

Répondre

1

En supposant que vous avez besoin de dynamique.

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(ID) From Yourtable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Column],' + @SQL + ' 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,''ID'' ,ID,ID) 
          ,(2,''XID'' ,ID,XID) 
          ,(3,''Amount'',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in (' + @SQL + ')) p 
Order By [Seq] 
' 
Exec(@SQL); 

Retours

enter image description here

Si vous n'avez pas besoin dynamique

Select [Column],[11],[12],[13],[14] 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,'ID' ,ID,ID) 
          ,(2,'XID' ,ID,XID) 
          ,(3,'Amount',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in ([11],[12],[13],[14])) p 
Order By [Seq] 
+0

Ceci est une solution fabuleuse. Merci!!! – RedRocketFire

+0

@RedRocketFire Heureux ça a aidé. Plus d'une transposition que Pivot :) –