Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Macêdo

Soma de valores por mês

Recommended Posts

Eu tenho uma tabela que ficam registrada as multas de uns veículos com os seguintes campos:

- id_multa (INT)

- data_entrada (DATE)

- num_valor (DOUBLE)

 

Gostaria de dar um SELECT nesta tabela de multas, mas que ele me retornasse o valor total de CADA MÊS. Exemplo

 

MÊS | TOTAL

01 | 3.405,78

02 | 2.835,12

03 | 3.485,57

04 | 5.823,34

ETC...

Compartilhar este post


Link para o post
Compartilhar em outros sites

sum e group by

+ou- isto :

 

select extract(month from data_entrada) as mes,
       sum(num_valor) as num_valor_tot
from tabela
where extract(year from data_entrada) = 2010
group by extract(month from data_entrada)

Esta síntaxe é a ANSI, mas cada BD tem uma forma de tratar isto, em geral mais fácil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de bola!

Não conhecia essa função extract()

 

Vou dar uma verificada a respeito mais nela e ver outras possibilidades de uso.

 

Muito obrigado Motta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, bateu uma dúvida a mais nesse código.

 

Você mostrou um exemplo que pega como referência o ano de 2010, mas a minha intenção era pegar os ultimos 12 meses, independente de ano. Como estamos em agosto, ele iria pegar desse mês até agosto de 2009.

 

Como ficaria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí começam as funções de data, elas mudam para cada BD.

 

Mas basicamente você deve buscar as datas maiores que um ano.

 

Em Oracle ficaria :

 

select extract(year from data_entrada)||extract(month from data_entrada) as mes,
       sum(num_valor) as num_valor_tot
from tabela
where data_entrada >= trunc((Sysdate-365),'mm')
group by extract(year from data_entrada)||extract(month from data_entrada)

 

trunc((Sysdate-365),'mm') - o 1º dia do mês de um ano atrás.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O BD que eu utilizo é o MySQL.

 

Eu estava pensando em utilizar o BETWEEN e colocar o intervalo pegando o ANO e MES atual até o ANO-1 e MES atual, mas estou "apanhando" por causa do EXTRACT para fazer esse comparativo de acordo com o código que você me informou.

 

Dessa forma com o between não seria mais fácil?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

 

Uma outra alternativa, tb muito legal, é usando o WITH ROLLUP. Ele além de calcular o que você precisa, ele também calcula o total de cada grupo e o total final de todos os grupos. Na verdade ele é um tipo de cubo estatístico. Muito bom!

 

SELECT

DATE_FORMAT(T_DataEntrada, '%Y') AS ANO,

DATE_FORMAT(T_DataEntrada, '%d') AS MES,

DATE_FORMAT(T_DataEntrada, '%d/%Y') AS MES_ANO, #Se desejar exibir Mês e Ano

C_Cliente,

SUM(T_Valor) AS TOTAL

FROM a_teste

 

WHERE DATE_FORMAT(T_DataEntrada, '%Y') = 2010

 

GROUP BY

DATE_FORMAT(T_DataEntrada, '%Y'),

DATE_FORMAT(T_DataEntrada, '%d'),

C_Cliente

 

WITH ROLLUP

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.