Há perguntas semelhantes aqui ,aqui respondido no stackoverflow.
Você precisa usar o operador PIVOT em sua consulta para conseguir isso. Aqui está o exemplo e a explicação de como você pode fazer isso. O exemplo é referenciado em isto 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)
Explicação
1. A primeira parte da consulta
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
fornece um bom resultado achatado dos valores da coluna Nome em uma única linha, como segue
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Você pode aprender mais sobre STUFF e XML PATH aqui e aqui .
2.
SELECT + @cols + FROM
irá selecionar todas as linhas como nomes de coluna para o conjunto de resultados final (pvt - passo 3) ou seja
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3.Esta consulta extrai todas as linhas de dados de que precisamos para criar os resultados da tabela cruzada. O (p) após a consulta está criando uma tabela temporária dos resultados que podem ser usados para satisfazer a consulta da etapa 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4. A expressão PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
faz a sumarização real e coloca os resultados em uma tabela temporária chamada pvt como
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76