Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Eu tenho uma tabela que ficam registrada as multas de uns veículos com os seguintes campos:
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...
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!
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?
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.
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?
select * from taba
where campo_da_data between now() - INTERVAL 1 YEAR and now()
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
sum e group by
+ou- isto :
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.