J'utilise SQL Server 2008 R2, j'ai ce tableau simple
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.