Select não soma

Firebird

08/06/2007

With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select QUANTIDADE, DATA, NUMEROPRODUTO, QUANTVENDIDA, PRECOUNITARIO,´+
´PRECOTOTAL, LUCROTOTAL, DESCONTO, PAGO, NUMEROCLIENTE,´+
´Sum(QUANTVENDIDA) as Quant, Sum(PRECOTOTAL) as Total,´+
´Sum(LUCROTOTAL) as Lucro, Sum(DESCONTO) as Desco from Vendas´);
SQL.Add(´Where (DATA >= :DtInicial and DATA <= :DtFinal)´);
SQL.Add(´Group by DATA, QUANTIDADE, NUMEROPRODUTO, QUANTVENDIDA, PRECOUNITARIO,´+
´PRECOTOTAL, LUCROTOTAL, DESCONTO, PAGO, NUMEROCLIENTE´);
ParamByName(´DTINICIAL´).AsDate := (DataInicial);
ParamByName(´DTFINAL´).AsDate := (DataFinal);
Prepare;
Open;
End;


Edilcimar

Edilcimar

Curtidas 0

Respostas

Acacio

Acacio

08/06/2007

Não entendi direito, não está somando ou não está mostrando nada.
O tipo DataInicial é DateTime ou data simples.


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Mostra tudo, seleciona a data corretamente, só não soma!


GOSTEI 0
Acacio

Acacio

08/06/2007

Bom, o group by faz a quebra por cada campo diferente que está
contido nele. Tem que ver se realmente é necessário mostrar todos os campos nessa consulta.


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

sim, todos os campos são necessários, pois o cliente precisa saber tudo que comprou e todos os detalhes das vendas, mas mesmo colocando apenas um único produto diversas vezes ele continua não somando


GOSTEI 0
Acacio

Acacio

08/06/2007

Eu vi alguns problemas no teu sql por exemplo:
Tais querendo mostrar os campos QUANTVENDIDA, PRECOTOTAL,
LUCROTOTAL e somar ao mesmo tempo, eu tirei esses campos dessa consulta e começou a somar certo. Tire eles do Group by também.
Não tem sentido quere somar e mostrá-los.


Poste uma mensagem se deu certo.


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Eu tenho que somar a quantidade vendida, o total, o lucro e o desconto para poder informar ao cliente, eu não posso oferecer informações pela metade


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/06/2007

acho que o que o colega está dizendo é que você está utilizando os mesmos campos para exibição e para agrupamento.

tente assim:
With IBQuery1 do
Begin
  Close;
  SQL.Clear;
  SQL.Add(
    ´Select DATA, NUMEROPRODUTO, PRECOUNITARIO, NUMEROCLIENTE,´+
    ´Sum(QUANTVENDIDA) as QuantidadeVendida, Sum(PRECOTOTAL) as Total,´+
    ´Sum(LUCROTOTAL) as Lucro, Sum(DESCONTO) as Desco from Vendas´);
  SQL.Add(´Where (DATA >= :DtInicial and DATA <= :DtFinal)´);
  SQL.Add(´Group by DATA, NUMEROPRODUTO, PRECOUNITARIO, NUMEROCLIENTE´);
  ParamByName(´DTINICIAL´).AsDate := (DataInicial);
  ParamByName(´DTFINAL´).AsDate := (DataFinal);
  Prepare;
  Open;
End;



GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Para mim, eu nem ao menos preciso agrupar nada, porém se deixar um dos campos (qualquer um) fora do group by, a sql dá um erro


GOSTEI 0
Acacio

Acacio

08/06/2007

Para todos os campos mostrados antes do from e que não seja somatória tem que aparecer no Group by. No group by todos os campos que forem colocados ali, mesmo que não esteja na primeira parte do sql
ele fará uma quebra para cada campo diferente então qualquer campo diferente que esteja no group by fara uma quebra sendo assim por isso ele não esta quebrando fiz o sql abaixo e ele está somando. Para entender melhor tire todos os campo e coloque um a um até achar a melhor solução.



SQl:

Select --QUANTIDADE,
DATA,NUMEROPRODUTO,PRECOUNITARIO,
--PAGO,
NUMEROCLIENTE,Sum(QUANTVENDIDA) as Quant,
Sum(PRECOTOTAL) as Total,
Sum(LUCROTOTAL) as Lucro, Sum(DESCONTO) as Desco
from Vendas
where (DATA >= ´01/01/2007´ and DATA <= ´07/30/2007´)
Group by --QUANTIDADE,
DATA,NUMEROCLIENTE,NUMEROPRODUTO,PRECOUNITARIO--,PAGO,


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Como informei anteriormente QUALQUER campo que eu venha a tirar do group by dá um erro na sql!
Simplesmente é impossível rodar sem o group by ou sem qualquer um dos campos no group by, não importa qual campo eu retire ele simplesmente dá um erro de sql, caso coloque todos os campos, aí ele funciona mas não soma


GOSTEI 0
Acacio

Acacio

08/06/2007

Você executou este último sql que postei? Qual éo Firibirt que tais usando? E por último tentasse executar este sql num Console?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/06/2007

With IBQuery1 do
Begin
  Close;
  SQL.Clear;
  SQL.Add(
    ´Select NUMEROCLIENTE, NUMEROPRODUTO, ´+
    ´Sum(QUANTVENDIDA) as QuantidadeVendida, Sum(PRECOTOTAL) as Total, ´+
    ´Sum(LUCROTOTAL) as Lucro, Sum(DESCONTO) as Desco from Vendas´);
  SQL.Add(´Where (DATA >= :DtInicial and DATA <= :DtFinal)´);
  SQL.Add(´Group by NUMEROCLIENTE, NUMEROPRODUTO´);
  ParamByName(´DTINICIAL´).AsDate := (DataInicial);
  ParamByName(´DTFINAL´).AsDate := (DataFinal);
  Prepare;
  Open;
End;



GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Acácio -> Sim tentei executar mas dá erro
Emerson -> reclama da falta do campo data, e quando é selecionado, dá erro na sql


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/06/2007

Para mim, eu nem ao menos preciso agrupar nada, porém se deixar um dos campos (qualquer um) fora do group by, a sql dá um erro
Olah amigo, mais vc que que apareça por exemplo somente a soma total de cada sum cfe. a data citada?

Se for, vc pode fazer por exemplo no query na propriedade SQL assim

Select sum(quantvendida)as QuantidadeVendida, sum(precototal)as total, sum(lucrototal) as lucro, sum(desconto)as desconto FROM vendas


Bom neste caso eu fiz assim somente para pegar os fields de cada soma e jogar em quatro DBText os fields.

Depois num button posso fazer o filtro assim
With ZQuery1 do
Begin
  Close;
  SQL.Clear;
    SQL.Add(
    ´Select Sum(QUANTVENDIDA) as QuantidadeVendida, Sum(PRECOTOTAL) as Total, ´+
    ´Sum(LUCROTOTAL) as Lucro, Sum(DESCONTO) as Desconto from Vendas´);
  SQL.Add(´Where (DATA between :DtInicial and :DtFinal)´);
  ParamByName(´DTINICIAL´).AsDate := strtodate(mask1.text);
  ParamByName(´DTFINAL´).AsDate := strtodate(Mask2.text);
  //Prepare;
  Open;
end;


Fiz aqui e funcionou, aou menos se eu filtrar apareçe o resultado cfe. as datas que eu quero.

Bom a nao ser que tenha que mostrar mais algo em algum dbgrid na hora de filtrar.


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Adriano, o que eu quero é mostrar o campo data, preço unitário, preço total, desconto e lucro.
Quero somar os campos preço total, desconto e lucro para efetuar cálculos com eles e mostrar ao cliente, qual foi o lucro bruto e qual o total de desconto e lucro líquido, isto entre 2 datas a escolha do cliente, portanto tenho que mostrar todos os campos citados


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/06/2007

Acácio -> Sim tentei executar mas dá erro Emerson -> reclama da falta do campo data, e quando é selecionado, dá erro na sql

A sua query está com os campos persistidos ?


GOSTEI 0
Adriano_servitec

Adriano_servitec

08/06/2007

Adriano, o que eu quero é mostrar o campo data, preço unitário, preço total, desconto e lucro. Quero somar os campos preço total, desconto e lucro para efetuar cálculos com eles e mostrar ao cliente, qual foi o lucro bruto e qual o total de desconto e lucro líquido, isto entre 2 datas a escolha do cliente, portanto tenho que mostrar todos os campos citados
Fazendo como o Emerson citou na SQL soma, mais ai soma somente os que estao agrupados exetamente todos os dados.

Aqui fazendo os testes funcionou tambem.


GOSTEI 0
Acacio

Acacio

08/06/2007

Está complicado de resolver.

Já tentasse colocar campo a campo, ou seja, começa somente com o sum e um campo, ai vai incrementando um a um , o campo que queres mostrar tem que estar no Group by, mas os campos que esta sendo feito o sum não devem aparecer na seleção e nem no group by.


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

A sql do emerson retorna 2 registros e 2 campos
NumeroProduto = 1 e 2 e NumeroProduto = 1 e 1

A sql do adriano retorna 1 registro 1 1 campo
Desconto = 0

O banco de dados possui 3 registros, 2 vendas do produto1 e 1 venda do produto2, sendo que o produto1 foi vendido em 2 datas, então seria
08/06/07->produto=1->quantidade=1-precototal=1.5->lucrototal=0.5->desconto=0
08/06/07->produto=2->quantidade=1-precototal=2->lucrototal=1->desconto=0
09/06/07->produto=1->quantidade=1->precototal=1.5->lucrototal=0.5->desconto=0
Como podem ver não tem nada no banco para que a coisa não some ou some errado


GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Só consegui resolver fazendo a gambiarra abaixo

With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select DATA, NUMEROPRODUTO, Sum(QUANTVENDIDA) As QuantVendida, ´ +
´Sum(LUCROTOTAL) as LucroTotal, Sum(PRECOTOTAL) as PrecoTotal, ´ +
´Sum(DESCONTO) as Desconto from Vendas´);
SQL.Add(´Where (DATA >= :DataInicial and DATA <= :DataFinal)´);
SQL.Add(´Group by DATA, NUMEROPRODUTO´);
ParamByName(´DATAINICIAL´).AsString := DateToStr(DataInicial);
ParamByName(´DATAFINAL´).AsString := DateToStr(DataFinal);
Prepare;
Open;
First;
Quant := 0;
Lucro := 0;
Desco := 0;
Total := 0;
While not eof do
Begin
Quant := Quant + FieldByName(´QUANTVENDIDA´).AsInteger;
Total := Total + FieldByName(´PRECOTOTAL´).AsFloat;
Lucro := Lucro + FieldByName(´LUCROTOTAL´).AsFloat;
Desco := Desco + FieldByName(´DESCONTO´).AsFloat;
Next;
End;
First;
End;
Edit1.Text := IntToStr(Quant);
Edit2.Text := FloatToStrF(Total, ffFixed, 10,2);
Edit3.Text := FloatToStrF(Lucro, ffFixed, 10,2);
Edit4.Text := FloatToStrF(Desco, ffFixed, 10,2);
Edit5.Text := FloatToStrF(Lucro - Desco, ffFixed, 10,2);


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/06/2007

pelo que deu pra perceber, você não precisa saber qual o produto nem a data, certo? você quer somente o total vendido num período. é isso?
se fôr, faça assim:
with IBQuery1 do
begin
  Close;
  SQL.Clear;
  SQL.Add(´Select Sum(QUANTVENDIDA) As QuantVendida, ´ +
  ´Sum(LUCROTOTAL) as LucroTotal, Sum(PRECOTOTAL) as PrecoTotal, ´ +
  ´Sum(DESCONTO) as Desconto from Vendas´);
  SQL.Add(´Where (DATA >= :DataInicial and DATA <= :DataFinal)´);
  ParamByName(´DATAINICIAL´).AsString := DateToStr(DataInicial);
  ParamByName(´DATAFINAL´).AsString := DateToStr(DataFinal);
  Prepare;
  Open;
end;



GOSTEI 0
Edilcimar

Edilcimar

08/06/2007

Eu preciso saber as datas, as vendas por data e o total geral de todas as datas


GOSTEI 0
POSTAR