Soma entre datas

Delphi

26/09/2006

Estou tentando fazer uma consulta que some os valores entre um período e que seja de um determinado tipo.

Para que seja melhor entendido, quero fazer a soma do dia (exemplo)01/01/2006 a 30/01/2006 e que contenha a palavra credito.
tentei desta forma e da erro
Select data, SUM(valor) From Financeiro
Where Data Between :DataI and :DataF 
and cred_deb = ´cred´


se coloco o [b:5497822161]GROUP BY [/b:5497822161]da erro:

Select data, SUM(valor) From Financeiro
Where Data Between :DataI and :DataF 
and cred_deb = ´cred´
group by data;


ERRO: [b:5497822161]Type mismatch in expression.[/b:5497822161]

Procurei no forum mas não encotrei nada disso aqui. :lol:


Vagner.oliveira

Vagner.oliveira

Curtidas 0

Respostas

Marco Salles

Marco Salles

26/09/2006

group by é usado para agregar os elementos do conjunto de resultado de acordo com algum critério

No seu caso :O conjunto de resltado da sua instrução select é apenas um valor .. Ou seja uma Soma.. Portanto não há o que agregar


é válido lembrar que todos os campo não calculados devem aparecer na
clausu-la group by.. .. Mas o campo Data no seu caso , esta na clausu-la where e portando não se aplica esse critério..


GOSTEI 0
Siam

Siam

26/09/2006

Para mim, seu segundo Select com Grou By está correto. O erro dado é em relação aos tipos de dados dos campos.
Como está no Banco o campo Data e como vc alimenta :DataI e :DataF ?


GOSTEI 0
Marco Salles

Marco Salles

26/09/2006

Para mim, seu segundo Select com Grou By está correto. O erro dado é em relação aos tipos de dados dos campos. Como está no Banco o campo Data e como vc alimenta :DataI e :DataF ?


Se segunda esta ´certa´ ,[b:59ea8d787f] a primeira tb esta[/b:59ea8d787f] ... Mesmo que não de erro na segunda acho no minimo esquisito Agrupar algo do nada

o fato é que li o post rapidamente e não vi qua o amigo [b:59ea8d787f]não tinha conseguido[/b:59ea8d787f] com a primeira instrução

o fato é que se tem um erro do tipo apresentado ERRO: Type mismatch in expression.

query1.Params[0].AsDate:=coloque aqui uma data; query1.Params[1].AsDate:=coloque aqui uma data; query1.params[2].asstring:=´credito´


isto resolve quanto ao problema do erro apresentado... Mas o groupBy acho desnecessário


GOSTEI 0
Macario

Macario

26/09/2006

Ola.

Pelo visto no codigo, ele quer a soma diaria de um periodo e nao a soma total do periodo, portanto o uso da agregacao.

Exemplo:

  
  Qry.Close;
  Qry.Params.ParamByName(´DATAI´).asDatetime = DataI;
  Qry.Params.ParamByName(´DATAF´).asDatetime = DataF;
  Qry.Open;



GOSTEI 0
Siam

Siam

26/09/2006

[quote:154481c0bb=´Marco Salles´]Se segunda esta ´certa´ , a primeira tb esta ... Mesmo que não de erro na segunda acho no minimo esquisito Agrupar algo do nada[/quote:154481c0bb]Não, a primeira dará erro pq vc não pode ter um campo Sum com outro(s) campo(s) sem agrupar; faça um teste.

O agrupamento faz sentido, desde que ele queira a soma dos valores por data.


GOSTEI 0
Marco Salles

Marco Salles

26/09/2006

a clausula groupBy existe para fixação de grupos .. Não é o caso dele
Sua sql retornara [b:abd0172705]apenas um unico valor [/b:abd0172705]e não precisa ou não tem que agrupar nada...


O agrupamento faz sentido, desde que ele queira a soma dos valores por data.


isto não é agrupamento .. isto é apenas uma[b:abd0172705] restrição [/b:abd0172705]
Alem da restrição por data ainda tem a restrição que os registros tenham a palavra credito

Para que seja melhor entendido, quero fazer a soma do dia (exemplo)01/01/2006 a 30/01/2006 e que contenha [b:abd0172705]a palavra credito.[/b:abd0172705]


e o campo credio , ande voce colocaria na clausula Group By ????

Select data, SUM(valor) From Financeiro Where Data Between :DataI and :DataF and cred_deb = ´cred´ group [b:abd0172705]by data , Cred_deb[/b:abd0172705]


pode não dar erro , mas não tem sentido


GOSTEI 0
Siam

Siam

26/09/2006

Supondo que se tenha vários registros (Crédito e Débito); e querer a soma por dia somente dos registros de crédito; daí entra no Where o período de datas e o tipo ´cred´. O tipo cred deve entrar no filtro e não no Group By.
Não faria sentido se se quisesse a soma total do período, aí o campo data teria que ser retirado do Select.


GOSTEI 0
Macario

Macario

26/09/2006

Para nao haver equivoco.

Dados:
DATA-----VALOR > TIPO
10/09-----200,00 > DEB
10/09-----150,00 > CRE
10/09-----100,00 > CRE
11/09-----200,00 > DEB
11/09-----150,00 > CRE
11/09-----100,00 > CRE


Select data, SUM(valor) From Financeiro
Where Data Between :DataI and :DataF
and cred_deb = ´cred´ 


Resultado
DATA-----VALOR
10/09-----250,00
11/09-----250,00


Compreende.


GOSTEI 0
Vagner.oliveira

Vagner.oliveira

26/09/2006

as datas sao entre um mes inteiro so separando se conter a palavra credito....


GOSTEI 0
Siam

Siam

26/09/2006

Código: Select data, SUM(valor) From Financeiro Where Data Between :DataI and :DataF and cred_deb = ´cred´
Se não colocar Group By data, para mim dá erro. Não dá para você ?


GOSTEI 0
Vagner.oliveira

Vagner.oliveira

26/09/2006

Para nao haver equivoco.
Dados:
DATA-----VALOR > TIPO
10/09-----200,00 > DEB
10/09-----150,00 > CRE
10/09-----100,00 > CRE
11/09-----200,00 > DEB
11/09-----150,00 > CRE
11/09-----100,00 > CRE
Select data, SUM(valor) From Financeiro
Where Data Between :DataI and :DataF
and cred_deb = ´cred´ 
Resultado
DATA-----VALOR
10/09-----250,00
11/09-----250,00
Compreende.


Compeendo, so não entendo porque da este erro:
[b:cd908d6428]GROUP BY is required when both aggregate and non-aggregate fields are used in result set.[/b:cd908d6428]


GOSTEI 0
Macario

Macario

26/09/2006

Ola, desculpem.

Sim o group by e requerido

corrigindo o post.


Para nao haver equivoco.
Dados:
DATA-----VALOR > TIPO
10/09-----200,00 > DEB
10/09-----150,00 > CRE
10/09-----100,00 > CRE
11/09-----200,00 > DEB
11/09-----150,00 > CRE
11/09-----100,00 > CRE
Select data, SUM(valor) From Financeiro
Where Data Between :DataI and :DataF
and cred_deb = ´cred´ 
[b]group by data[/b]
Resultado
DATA-----VALOR
10/09-----250,00
11/09-----250,00
Compreende.



GOSTEI 0
Fknyght

Fknyght

26/09/2006

Select data, SUM(valor) From Financeiro 
Where Data >= :DataI and  data <= :DataF 
and cred_deb like ´cred¬´ 
group by data 



tenta ai, ve se resolve


GOSTEI 0
Marco Salles

Marco Salles

26/09/2006

Ola, desculpem. Sim o group by e requerido [b:dac6ae2a47]corrigindo o post. [/b:dac6ae2a47] Macario escreveu: Para nao haver equivoco. Código: Dados: DATA-----VALOR > TIPO 10/09-----200,00 > DEB 10/09-----150,00 > CRE 10/09-----100,00 > CRE 11/09-----200,00 > DEB 11/09-----150,00 > CRE 11/09-----100,00 > CRE Código: Select [b:dac6ae2a47]data,[/b:dac6ae2a47] SUM(valor) From Financeiro Where Data Between :DataI and :DataF and cred_deb = ´cred´ [b:dac6ae2a47]group by data[/b:dac6ae2a47] Código: Resultado DATA-----VALOR 10/09-----250,00 11/09-----250,00 Compreende.


olha , escrevi alguma coisa e fiz outra

[b:dac6ae2a47]eu não vi o campo data[/b:dac6ae2a47] fazendo parte do[b:dac6ae2a47] select.. [/b:dac6ae2a47]To desde do inico falando que o resultado seria um unico valor.. Recebi notificaçoes dizendo da clausula do GroupBy , mas nada contestando esta afirmação

group by é usado para agregar os elementos do conjunto de resultado de acordo com algum critério No seu caso :O conjunto de resultado da sua instrução select é apenas um valor .. Ou seja uma Soma.. Portanto não há o que agregar


pensei que o select era este :oops: :oops:

Select SUM(valor) From Financeiro Where Data Between :DataI and :DataF and cred_deb = ´cred´


por isso estava batendo na tecla que não precisa do Group-By porque para mim ele estava fazendo somente uma soma em um detreminado periodo

agora que o [b:dac6ae2a47]marcario[/b:dac6ae2a47] postou , vi que tinha o [b:dac6ae2a47]campo data [/b:dac6ae2a47], :cry: ai fui ver o post original vi tb que tinha o campo data :cry: .. Ora , sto não era nen para ´discutir´ , pois todos sabemos que :
[b:dac6ae2a47]Todos os campos não calculados devem aparecer na clausula Group_by[/b:dac6ae2a47]

é.......


GOSTEI 0
Macario

Macario

26/09/2006

Ola, Marco.

Por isso coloquei para nao ter [b:cb865f0363]Equivoco[/b:cb865f0363].

O posto do nosso colega Vagner, estava sem maiores indicacoes da necessidade dele, se o agrupamento era geral pelo periodo(no caso se aplica a tua indicacao inicial), ou por data dentro do periodo conforme o exemplo que postei.


[]´s


GOSTEI 0
Vagner.oliveira

Vagner.oliveira

26/09/2006

Select data, SUM(valor) From Financeiro 
Where Data >= :DataI and  data <= :DataF 
and cred_deb like ´cred¬´ 
group by data 
tenta ai, ve se resolve


Já tinha tendado antes e da o mesmo erro:
[b:a6ec1b179f]Type mismatch in expression.[/b:a6ec1b179f]


GOSTEI 0
Macario

Macario

26/09/2006

Para mim, seu segundo Select com Grou By está correto. O erro dado é em relação aos tipos de dados dos campos. Como está no Banco o campo Data e como vc alimenta :DataI e :DataF ?


Verifique as indicacoes passadas pelo colega [b:0d79be72b9]siam[/b:0d79be72b9].

Pois o erro nao se encontra na instrucao, em especifico. :!:


GOSTEI 0
Vagner.oliveira

Vagner.oliveira

26/09/2006

[quote:cff0b1d0fc=´siam´]Para mim, seu segundo Select com Grou By está correto. O erro dado é em relação aos tipos de dados dos campos. Como está no Banco o campo Data e como vc alimenta :DataI e :DataF ?


Verifique as indicacoes passadas pelo colega [b:cff0b1d0fc]siam[/b:cff0b1d0fc].

Pois o erro nao se encontra na instrucao, em especifico. :!:[/quote:cff0b1d0fc]

achei o problema. valew


GOSTEI 0
Macario

Macario

26/09/2006

achei o problema. valew



Poderia nos informar qual era. :?:


[]´s 8)


GOSTEI 0
POSTAR