Il y a des questions similaires ici ,ici répondu dans stackoverflow.
Vous devez utiliser l'opérateur PIVOT dans votre requête pour y parvenir.Voici l'exemple et l'explication sur la façon dont vous pouvez le faire.L'exemple est référencé à partir de ceci la source.
---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
SET @query = N'SELECT '+ @cols +' FROM
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
AS pvt;'
EXECUTE(@query)
Explication
1.La première partie de la requête
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
vous donne un joli résultat aplati de vos valeurs de colonne Nom dans une seule ligne comme suit
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Vous pouvez en savoir plus sur STUFF et XML PATH ici et ici .
2.SELECT + @cols + FROM
sélectionnera toutes les lignes comme noms de colonnes pour le jeu de résultats final (pvt - étape 3)
c'est-à-dire
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3.Cette requête extrait toutes les lignes de données dont nous avons besoin pour créer les résultats du tableau croisé. Le (p) après la requête crée une table temporaire des résultats qui peut ensuite être utilisée pour satisfaire la requête de l'étape 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4.L'expression PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
fait le résumé réel et place les résultats dans une table temporaire appelée pvt as
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76