Hay preguntas similares aquí ,aquí respondido en stackoverflow.
Debe usar el operador PIVOT en su consulta para lograr esto. Aquí está el ejemplo y la explicación de cómo puede hacerlo. Se hace referencia al ejemplo desde esto fuente.
---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)
Explicación
1.La primera parte de la consulta
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
le da un buen resultado aplanado de los valores de su columna Nombre en una sola fila de la siguiente manera
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Puede obtener más información sobre STUFF y XML PATH aquí y aquí .
2.SELECT + @cols + FROM
seleccionará todas las filas como nombres de columna para el conjunto de resultados final (pvt - paso 3)
es decir
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3.Esta consulta extrae todas las filas de datos que necesitamos para crear los resultados de tabulación cruzada. La (p) después de la consulta está creando una tabla temporal de los resultados que luego se pueden usar para satisfacer la consulta del paso 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4.La expresión PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
hace el resumen real y coloca los resultados en una tabla temporal llamada pvt como
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76