Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

convertir une ligne en colonnes

Consultez les tableaux croisés dynamiques ;

Voir http://msdn.microsoft.com/en-us/library/ ms177410.aspx

Une simple requête pour un nombre fini de StatusTypeNames ressemblerait à quelque chose comme ;

SELECT * FROM 
(SELECT MonthName, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt 
PIVOT ( MAX(StatusCount) FOR attributeCol in ([ToBeScheduled],[Complete])) as pvt
ORDER BY MonthName

Notez l'utilisation de MAX. S'il est possible que vous ayez plusieurs lignes avec la même combinaison de nom de mois et de nom de type de statut, vous pouvez utiliser SUM.

Pour utiliser les colonnes dynamiques comme le suggère madhivinan, vous pouvez suivre cet exemple. Faites défiler vers le bas.

J'ai essayé de le faire fonctionner avec votre exemple, mais parce que j'ai eu quelques problèmes probablement dus au fait que je n'avais pas les tables. Cependant, quelque chose comme ce qui suit est ce que vous recherchez.

DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT  @listCol = SELECT STUFF (( SELECT DISTINCT '],[' + 
                    StatusTypeName FROM @ResultsTable ORDER BY '],[' + 
                    StatusTypeName FOR XML PATH ('')), 1, 2, '') + ']'


SET @query =
'SELECT * FROM
      (SELECT MonthNameCol, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ('[email protected]+')) AS pvt ORDER BY MonthNameCol'

EXECUTE (@query)

Ce n'est pas tout à fait exact, mais c'est un point de départ.

Bonne chance.