Montar SQL por mes agrupado

Delphi

08/08/2008

Boa noite , gostaria de uma dica como posso montar minha SQL onde irei mostrar num grid da seguinte maneira:

MES VALOR
JANEIRO 1000,00
FEVEREIRO 500,00
JULHO 250,00

Como posso montar uma sql q AGRUPA e totaliza o valor de uma tabela .
tabela de PAGAMENTOS ( Codigo, Vencto, Valor )

Utilizo D7, Interbase.

desde ja agradeco.


Walter Faria

Walter Faria

Curtidas 0

Respostas

Leufmt

Leufmt

08/08/2008

Select Vencto, Sum(Valor) from PAGAMENTOS
Group by Vencto


GOSTEI 0
Webjoel

Webjoel

08/08/2008

Olá!

Segue o SQL:
SELECT 

EXTRACT(MONTH FROM DT_VENCIMENTO) AS MES,
SUM(VALOR) AS TOTAL_MES

FROM PAGAMENTOS

GROUP BY MES;



Dependendo do seu objetivo, seria importamte agrupar também pelo ano, extraindo o year da dt_vencimento também, e agrupando pelos dois.


GOSTEI 0
Walter Faria

Walter Faria

08/08/2008

Entao, ficou desta forma, deste jeito :

Select EXTRACT(MONTH FROM DataVencimento) as MES, Sum(Valor) as Valor from CHEQUE
Group by DataVencimento

MES VALOR
2 1000,00
5 500,00


queria q ficasse assim , tem como ?

MES VALOR
fevereiro 1000,00
maio 500,00


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

08/08/2008

Select 
  CASE   EXTRACT(MONTH FROM DataVencimento)
            WHEN 1 THEN ´JANEIRO´
            WHEN 2 THEN ´FERVEREIRO´
            WHEN 3 THEN ´MARÇO´
            WHEN 4 THEN ´ABRIL´
            WHEN 5 THEN ´MAIO´
            WHEN 6 THEN ´JUNHO´
            WHEN 7 THEN ´JULHO´
            WHEN 8 THEN ´AGOSTO´
            WHEN 9 THEN ´SETEMBRO´
            WHEN 10 THEN ´AGOSTO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END as MES, Sum(Valor) as Valor 
from CHEQUE 
Group by DataVencimento



GOSTEI 0
Walter Faria

Walter Faria

08/08/2008

entao, tentei executar esta SQL mas esta dando erro no EXTRACT

token tonknow - line 2, char 8 EXTRACT

oq pode ser?


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

No firebird 2.0 funciona, mas tenho uma duvida também no Order By

gostaria de saber como faço um order by neste select aqui, para ordernar por mes

Select
  CASE EXTRACT(MONTH FROM mes)
            WHEN 1  THEN ´JANEIRO´
            WHEN 2  THEN ´FERVEREIRO´
            WHEN 3  THEN ´MARÇO´
            WHEN 4  THEN ´ABRIL´
            WHEN 5  THEN ´MAIO´
            WHEN 6  THEN ´JUNHO´
            WHEN 7  THEN ´JULHO´
            WHEN 8  THEN ´AGOSTO´
            WHEN 9  THEN ´SETEMBRO´
            WHEN 10 THEN ´AGOSTO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END as MES, Sum(Valor) as Valor
from new_table
group by 1
order by extract(month from mes) desc


[color=red:123e0677b1]
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Dumped 72678736 pages of a total 40538700 database pages.[/color:123e0677b1]

Assim funciona
select extract(month from mes), sum(valor) as valor
from new_table
group by 1
order by extract(month from mes) desc



GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

Achei que poderia ser no código em vermelho
Select CASE EXTRACT(MONTH FROM mes) WHEN 1 THEN ´JANEIRO´ WHEN 2 THEN ´FERVEREIRO´ WHEN 3 THEN ´MARÇO´ WHEN 4 THEN ´ABRIL´ WHEN 5 THEN ´MAIO´ WHEN 6 THEN ´JUNHO´ WHEN 7 THEN ´JULHO´ WHEN 8 THEN ´AGOSTO´ WHEN 9 THEN ´SETEMBRO´ [color=red:d1aa216a7c] WHEN 10 THEN ´AGOSTO´[/color:d1aa216a7c] WHEN 11 THEN ´NOVEMBRO´ WHEN 12 THEN ´DEZEMBRO´ END as MES, Sum(Valor) as Valor from new_table group by 1 order by extract(month from mes) desc

Mais arrumei, e coloquei o certo e não é ai não o problema.


GOSTEI 0
Webjoel

Webjoel

08/08/2008

Olá!

Select
  EXTRACT(MONTH FROM T.DT_VENCIMENTO) AS NR_MES,
  CASE EXTRACT(MONTH FROM T.DT_VENCIMENTO)
            WHEN 1  THEN ´JANEIRO´
            WHEN 2  THEN ´FERVEREIRO´
            WHEN 3  THEN ´MARÇO´
            WHEN 4  THEN ´ABRIL´
            WHEN 5  THEN ´MAIO´
            WHEN 6  THEN ´JUNHO´
            WHEN 7  THEN ´JULHO´
            WHEN 8  THEN ´AGOSTO´
            WHEN 9  THEN ´SETEMBRO´
            WHEN 10 THEN ´AGOSTO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END AS MES,
  SUM(T.VALOR) as VALOR
from TABELA T
group by 1,2
order by 1



GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

Olá!
Select
  EXTRACT(MONTH FROM T.DT_VENCIMENTO) AS NR_MES,
  CASE EXTRACT(MONTH FROM T.DT_VENCIMENTO)
            WHEN 1  THEN ´JANEIRO´
            WHEN 2  THEN ´FERVEREIRO´
            WHEN 3  THEN ´MARÇO´
            WHEN 4  THEN ´ABRIL´
            WHEN 5  THEN ´MAIO´
            WHEN 6  THEN ´JUNHO´
            WHEN 7  THEN ´JULHO´
            WHEN 8  THEN ´AGOSTO´
            WHEN 9  THEN ´SETEMBRO´
            WHEN 10 THEN ´AGOSTO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END AS MES,
  SUM(T.VALOR) as VALOR
from TABELA T
group by 1,2
order by 1
Valeu pela dica amigo, olhando o teu select vi que neste caso os meses em formato de numeros também entrariam no select, mais posso resolver isso mostranto apenas os campos necessários eliminando este campo [b:01dfb0e7e3]NR_MES[/b:01dfb0e7e3]

Select
  EXTRACT(MONTH FROM mes) AS NR_MES,
  CASE EXTRACT(MONTH FROM mes)
            WHEN 1  THEN ´JANEIRO´
            WHEN 2  THEN ´FERVEREIRO´
            WHEN 3  THEN ´MARÇO´
            WHEN 4  THEN ´ABRIL´
            WHEN 5  THEN ´MAIO´
            WHEN 6  THEN ´JUNHO´
            WHEN 7  THEN ´JULHO´
            WHEN 8  THEN ´AGOSTO´
            WHEN 9  THEN ´SETEMBRO´
            WHEN 10 THEN ´OUTUBRO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END AS MES,
  SUM(VALOR) as VALOR
from new_table
group by 1,2
order by 1 desc


Obrigado.


GOSTEI 0
Webjoel

Webjoel

08/08/2008

Pois é, coloquei o campo ´NR_MES´, para o select retornar a ordem correta dos meses, Janeiro, Fevereiro, Março...,

Então, lá onde você vai mostrar o resultado é só ignorar este primeiro campo mesmo.

Boas compilações!


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

Pois é, coloquei o campo ´NR_MES´, para o select retornar a ordem correta dos meses, Janeiro, Fevereiro, Março..., Então, lá onde você vai mostrar o resultado é só ignorar este primeiro campo mesmo. Boas compilações!
Pelo visto diretamente não tem jeito mesmo, mais tá bom assim mesmo.

Obrigado amigo


GOSTEI 0
Walter Faria

Walter Faria

08/08/2008

Entao, utilizo interbase e delphi 7 e nao consigo deixar query funcionando. da mesmo erro.

se alguem puder me ajudar, fico grato


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

[quote:1c00802b4d=´Walter Faria´]Entao, utilizo interbase e delphi 7 e nao consigo deixar query funcionando. da mesmo erro.

se alguem puder me ajudar, fico grato[/quote:1c00802b4d]Acho que o erro ai é porque a função CASE foi implementada a partir InterBase 7.5.

Se vc estiver usando uma versão inferior o CASE não vai funcionar, mais também não sei como fazer, pois não utilizo o interbase.


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/08/2008

Observando aqui, vi que também a necessidade de incluir o ano no select, para não fazer uma soma errada, tipo acumular por anos diferentes.

Select
  EXTRACT(MONTH FROM mes) AS NR_MES,
  Extract(year from mes) as NR_Ano,
  CASE EXTRACT(MONTH FROM mes)
            WHEN 1  THEN ´JANEIRO´
            WHEN 2  THEN ´FERVEREIRO´
            WHEN 3  THEN ´MARÇO´
            WHEN 4  THEN ´ABRIL´
            WHEN 5  THEN ´MAIO´
            WHEN 6  THEN ´JUNHO´
            WHEN 7  THEN ´JULHO´
            WHEN 8  THEN ´AGOSTO´
            WHEN 9  THEN ´SETEMBRO´
            WHEN 10 THEN ´OUTUBRO´
            WHEN 11 THEN ´NOVEMBRO´
            WHEN 12 THEN ´DEZEMBRO´
  END AS MES,
  SUM(VALOR) as VALOR
from new_table
group by 1,2,3
order by 1,2



GOSTEI 0
POSTAR