Array
(
)

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

Horus
   - 14 set 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.


Tnaires
   - 14 set 2004

Olá
Vc não precisa gravar o total da venda na tabela, pois isso vc pode calcular com a seguinte instrução SQL:
#Código

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.


Djjunior
   - 14 set 2004

se vc precisa de dados de ambas as tabelas use

Citação:

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

Citação:

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


Horus
   - 15 set 2004

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.


Rodolpho123
   - 15 set 2004

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:
#Código


IBQuery1.ParamByName(´Seu_Parametro´).Value := Seu_valor;



Tnaires
   - 15 set 2004


Citação:
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

Citação:
É 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.