hay preguntas similares here, here respondidas en stackoverflow.
Es necesario utilizar el operador PIVOT en su consulta a acheive this.Here es el ejemplo y la explicación de cómo se puede hacer ello.El ejemplo se hace referencia desde this 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, '') + ']'
que da un resultado agradable aplanado de sus valores de columna Nombre en una sola fila como sigue
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Puede lea Más información sobre STUFF y XML PATH here y here.
2. SELECT + @cols + FROM
seleccionará todas las filas como nombres de Coloumn para el conjunto de resultados finales (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 la tabla cruzada. El (p) después de la consulta es la creación de una tabla temporal de los resultados que se pueden usar entonces para satisfacer la consulta para el paso 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4.El expresión PIVOT
PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt
hace el real resumen y pone los resultados en una tabla temporal denominada Pvt como
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76
+1, gran solución y respuesta. tenga en cuenta que el 'TOP 100 PERCENT' se puede cambiar a 'TOP 30' o lo que sea, por lo que no debe exceder el número de columnas si tiene muchas filas. –