Select não soma
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;
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
Curtidas 0
Respostas
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.
O tipo DataInicial é DateTime ou data simples.
GOSTEI 0
Edilcimar
08/06/2007
Mostra tudo, seleciona a data corretamente, só não soma!
GOSTEI 0
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.
contido nele. Tem que ver se realmente é necessário mostrar todos os campos nessa consulta.
GOSTEI 0
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
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.
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
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
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:
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
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
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,
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
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
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
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
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
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
Emerson -> reclama da falta do campo data, e quando é selecionado, dá erro na sql
GOSTEI 0
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
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
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
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
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
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.
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
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
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
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);
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
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:
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
08/06/2007
Eu preciso saber as datas, as vendas por data e o total geral de todas as datas
GOSTEI 0