sexta-feira, 17 de outubro de 2008

DICA: Como sumarizar dados condicionalmente

Não raro nos deparamos com a necessidade de sumarizar dados e apresenta-los em forma colunar. Ex.:


ano jan fev mar ...
2007 99.999,99 99.999,99 99.999,99 ...
2008 99.999,99 99.999,99 99.999,99 ...


neste caso, contamos com uma grande ajuda na maioria dos SGDB's modernos: a instrução CASE.

Para atender à necessidade acima citada poderiamos escrever um código semelhante a este:

select ano,
sum(case when mes=1 then valor else 0 end) mes_01,
sum(case when mes=2 then valor else 0 end) mes_02,
sum(case when mes=3 then valor else 0 end) mes_03,
sum(case when mes=4 then valor else 0 end) mes_04,
sum(case when mes=5 then valor else 0 end) mes_05,
sum(case when mes=6 then valor else 0 end) mes_06,
sum(case when mes=7 then valor else 0 end) mes_07,
sum(case when mes=8 then valor else 0 end) mes_08,
sum(case when mes=9 then valor else 0 end) mes_09,
sum(case when mes=10 then valor else 0 end) mes_10,
sum(case when mes=11 then valor else 0 end) mes_11,
sum(case when mes=12 then valor else 0 end) mes_12,
sum(valor) total
from minha_tabela
where ano between 2006 and 2008
group by ano


É muito importante observar que a instrução CASE fica dentro da função de agregação SUM() e não o contrário.

A nomeação dos campos como mes_xx foi proposital, para facilitar a escrita do programa de forma genérica.

Por enquanto é só. Use a sua criatividade e terá muito poder nas suas mãos.

OBS: A sintaxe do SQL que eu usei funciona em Firebird 1.5+, MySQL 4+ e SQL Server. Quanto a outros bancos de dados não sei dizer...

Nenhum comentário:

 

web analytics software