Ci sono domande simili qui ,qui ha risposto in stackoverflow.
È necessario utilizzare l'operatore PIVOT nella tua query per ottenere questo. Ecco l'esempio e la spiegazione su come farlo. L'esempio è citato da questo fonte.
---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)
Spiegazione
1.La prima parte della query
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
ti dà un bel risultato appiattito dei valori della colonna Nome in una singola riga come segue
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Puoi saperne di più su STUFF e XML PATH qui e qui .
2.SELECT + @cols + FROM
selezionerà tutte le righe come nomi di colonna per il set di risultati finale (pvt - passaggio 3)
cioè
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3.Questa query estrae tutte le righe di dati di cui abbiamo bisogno per creare i risultati a campi incrociati. Il (p) dopo la query sta creando una tabella temporanea dei risultati che può quindi essere utilizzata per soddisfare la query per il passaggio 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4.L'espressione PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
esegue il riepilogo effettivo e inserisce i risultati in una tabella temporanea denominata pvt as
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76