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
.