SQL Server 2008 R2 utilisant PIVOT avec des colonnes varchar ne fonctionnant pas

J'utilise SQL Server 2008 R2, j'ai ce tableau simple

entrez la description de l'image ici

Ce que j'essayais de faire est de faire une sélection à partir de cette table et d'get le résultat suivant

x | 1 | 2 | 3 --+------------+-------------+------------ 1 | first 1 | first 2 | first 3 2 | Second 1 | second 2 | second 3 

Je pensais que cela peut être fait avec PIVOT

Je ne sais pas grand-chose sur PIVOT et tous mes résultats de search trouvés en utilisant PIVOT avec Count() . SUM() , AVG() qui ne fonctionnera pas dans ma table puisque j'essaye de PIVOT sur une colonne varchar

Question est -ce que j'utilise la bonne fonction? Ou y a-t-il autre chose que je dois savoir pour résoudre ce problème? toute aide serait appréciée

J'ai essayé ça sans chance

 PIVOT(count(x) FOR value IN ([1],[2],[3]) )as total PIVOT(count(y) FOR value IN ([1],[2],[3]) )as total // This one is the nearest of what i wand but instead of the column value values i get 0 

Voici la requête si quelqu'un pour le tester

 CREATE TABLE #test (x int , y int , value Varchar(50)) INSERT INTO #test VALUES(1,51,'first 1') INSERT INTO #test VALUES(1,52,'first 2') INSERT INTO #test VALUES(1,53,'first 3') INSERT INTO #test VALUES(2,51,'Second 1') INSERT INTO #test VALUES(2,52,'Second 2') INSERT INTO #test VALUES(2,53,'Second 3') SELECT * FROM #test PIVOT(count(y) FOR value IN ([1],[2],[3]) )as total DROP TABLE #test 

Lorsque vous utilisez la fonction PIVOT, les valeurs de la clause IN doivent correspondre à une valeur que vous select. Vos données actuelles n'incluent pas 1, 2 ou 3. Vous pouvez utiliser row_number() pour atsortingbuer une valeur à chaque x :

 select x, [1], [2], [3] from ( select x, value, row_number() over(partition by x order by y) rn from test ) d pivot ( max(value) for rn in ([1], [2], [3]) ) piv; 

Voir SQL Fiddle avec démo . Si vous avez alors un nombre inconnu de valeurs pour chaque x , alors vous voudrez utiliser le SQL dynamic:

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(row_number() over(partition by x order by y)) from test FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT x,' + @cols + ' from ( select x, value, row_number() over(partition by x order by y) rn from test ) x pivot ( max(value) for rn in (' + @cols + ') ) p ' execute(@query); 

Voir SQL Fiddle avec démo

La key est d'utiliser la fonction Max pour les champs de text.

Question:

 SELECT X, [51] [1], [52] [2], [53] [3] FROM (select * from test) t PIVOT(max(Value) FOR Y IN ([51], [52], [53]) )as total 

Démonstration de travail

 SELECT * FROM #test PIVOT(MAX(value) FOR y IN ([51],[52],[53]) )as total 

Je te donne un tour mais ça n'a pas de sens.

 SELECT * FROM (SELECT x, y-50 as y, value FROM test) src PIVOT(max(value) FOR y IN ([1],[2],[3]) )as total 

Vous dites la value IN ([1],[2],[3]) . Cela signifie que "match si la valeur est exactement égale à 1, 2 ou 3". Mais dans ta table ça ne l'est jamais. Quelque chose ne va pas bien.