Confira as tabelas dinâmicas;
Consulte http://msdn.microsoft.com/en-us/library/ ms177410.aspx
Uma consulta simples para um número finito de StatusTypeNames seria algo como;
SELECT * FROM
(SELECT MonthName, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ([ToBeScheduled],[Complete])) as pvt
ORDER BY MonthName
Observe o uso de MAX. Se houver a chance de você ter várias linhas com a mesma combinação de nome de mês e nome de tipo de status, convém usar SUM.
Para fazer uso de colunas dinâmicas como sugere madhivinan, você pode seguir este exemplo. Role para baixo.
Tentei fazê-lo funcionar com o seu exemplo, mas porque tive alguns problemas provavelmente devido ao fato de não ter as tabelas. No entanto, algo como o seguinte é o que você está procurando.
DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT @listCol = SELECT STUFF (( SELECT DISTINCT '],[' +
StatusTypeName FROM @ResultsTable ORDER BY '],[' +
StatusTypeName FOR XML PATH ('')), 1, 2, '') + ']'
SET @query =
'SELECT * FROM
(SELECT MonthNameCol, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ('[email protected]+')) AS pvt ORDER BY MonthNameCol'
EXECUTE (@query)
Não é exatamente certo, mas é um ponto de partida.
Boa sorte.