Dúvida com código em SLQ...

14/09/2004

Saudações a todos.

Situação:
1. Tenho duas tabelas: Venda e VendaProdutos.

2. Na tabela Venda tenho: codigovenda, codigocliente, nomecliente, datavenda, valorvenda.

3. Na tabela VendaProdutos tenho: codigo, codigovenda, codigoproduto, descproduto, valorunitario, quantidade, valortotalproduto.

Problema:

Preciso de uma instrução que faça uma soma do ´valortotalproduto´ onde seja Venda(CodigoVenda) = VendaProduto(CodigoVenda).

Mais claro: preciso do valor total dos produtos para cada venda feita onde eu transfiro este valor total dos produtos da venda para o valor da venda.

Desde já agradeço a ajuda.


Horus

Respostas

14/09/2004

Tnaires

Olá
Vc não precisa gravar o total da venda na tabela, pois isso vc pode calcular com a seguinte instrução SQL:
SELECT Venda.codigovenda, SUM(VendaProdutos.valortotalproduto) AS Soma
FROM Venda, VendaProdutos
WHERE VendaProdutos.codigovenda = Venda.codigovenda
GROUP BY Venda.codigovenda

Abraços.

P.S. - se vc tá gravando o código do cliente na tabela d vendas, vc não precisa gravar o nome do cliente... Seu banco fica redundante. Da mesma maneira, se vc tá gravando o código do produto na tabela VendaProdutos, vc não precisa gravar a descrição.


Responder Citar

14/09/2004

Djjunior

se vc precisa de dados de ambas as tabelas use
select v.codigovenda, v.nomecliente, sum(p.valortotalproduto) from venda v, VendaProdutos p where v.codigovenda = p.codigovenda and v.codigovenda = :venda Group By v.codigovenda, v.nomecliente


se o vc precisa é só os totais por venda então use
select p.codigovenda, nomecliente, sum(p.valortotalproduto) from VendaProdutos p where v.codigovenda = :venda Group By v.codigovenda


bem acho que daqui já dá pra andar sozinho blz.

mas qualquer coisa é só perguntar[/quote]


Responder Citar

15/09/2004

Horus

Fiz o seguinte:
Coloquei uma IBQuery no Form e depois na instrução SQL coloquei a sugestão do djjunior.
Problema: a query sempre pega o valor da primeira venda.

Outra dúvida: como eu passo um parâmetro para uma instrução SQL no IB/FB???

Obrigado pela ajuda.


Responder Citar

15/09/2004

Rodolpho123

Nas opções acima, primeiro vc primeiro retira a cláusula Where e depois do Group By, vc adiciona a cláusula Having e nessa cláusula, vc coloca a condição que vc usava no Where.
Para passar parâmetros, dentro do seu código:
IBQuery1.ParamByName(´Seu_Parametro´).Value := Seu_valor;



Responder Citar

15/09/2004

Tnaires

Nas opções acima, primeiro vc primeiro retira a cláusula Where e depois do Group By, vc adiciona a cláusula Having e nessa cláusula, vc coloca a condição que vc usava no Where.

Acho q não
[quote:c7bd357a68=´Adaptado de http://www.postgresql.org.br/tutorial2/tutorial-agg.html´] É importante compreender a interação entre as agregações e as cláusulas WHERE e HAVING do SQL. A diferença fundamental entre WHERE e HAVING é esta: o WHERE seleciona as linhas de entrada antes dos grupos e agregações serem computados (portanto, controla quais linhas irão para o computo da agregação), enquanto o HAVING seleciona grupos de linhas após os grupos e agregações serem computados. Portanto, a cláusula WHERE não pode conter funções de agregação; não faz sentido tentar utilizar uma agregação para determinar quais linhas serão a entrada da agregação. Por outro lado, a cláusula HAVING sempre possui função de agregação (Falando estritamente, é permitido escrever uma cláusula HAVING que não possua agregação, mas é desperdício: A mesma condição poderia ser utilizada de forma mais eficiente no estágio do WHERE).
Observe que a restrição indicada poderia ser colocada na cláusula WHERE, porque não necessita de nenhuma agregação. É mais eficiente que colocar a restrição na cláusula HAVING, porque evita fazer os procedimentos de agrupamento e agregação para todas as linhas que não atendem a cláusula WHERE. [/quote:c7bd357a68]


Responder Citar