Ir para o conteúdo

Pivot com CASE

O seguinte script T-SQL permite fazer "Pivoting" utilizando a função CASE, ou seja, somar um determinado campo numa tabela e agrupá-lo por ano (linhas) e meses (colunas).

SELECT     YEAR(randomDateField) AS Ano, ROUND(SUM(CASE month(randomDateField) WHEN 1 THEN randomDecimalField ELSE 0 END), 0) AS Jan, ROUND(SUM(CASE month(randomDateField) 
                      WHEN 2 THEN randomDecimalField ELSE 0 END), 0) AS Fev, ROUND(SUM(CASE month(randomDateField) WHEN 3 THEN randomDecimalField ELSE 0 END), 0) AS Mar, 
                      ROUND(SUM(CASE month(randomDateField) WHEN 4 THEN randomDecimalField ELSE 0 END), 0) AS Abr, ROUND(SUM(CASE month(randomDateField) WHEN 5 THEN randomDecimalField ELSE 0 END), 
                      0) AS Mai, ROUND(SUM(CASE month(randomDateField) WHEN 6 THEN randomDecimalField ELSE 0 END), 0) AS Jun, ROUND(SUM(CASE month(randomDateField) 
                      WHEN 7 THEN randomDecimalField ELSE 0 END), 0) AS Jul, ROUND(SUM(CASE month(randomDateField) WHEN 8 THEN randomDecimalField ELSE 0 END), 0) AS Ago, 
                      ROUND(SUM(CASE month(randomDateField) WHEN 9 THEN randomDecimalField ELSE 0 END), 0) AS 'Set', ROUND(SUM(CASE month(randomDateField) 
                      WHEN 10 THEN randomDecimalField ELSE 0 END), 0) AS 'Out', ROUND(SUM(CASE month(randomDateField) WHEN 11 THEN randomDecimalField ELSE 0 END), 0) AS Nov, 
                      ROUND(SUM(CASE month(randomDateField) WHEN 12 THEN randomDecimalField ELSE 0 END), 0) AS Dez
FROM         randomTable
GROUP BY YEAR(randomDateField)
ORDER BY Ano

Em que:

randomDatelField

representa um campo de data qualquer utilizado para agrupar a informação, o campo randomDecimalField representa o campo a totalizar, pertencentes a uma determinada tabela, representada neste exemplo por randomTable.