[firebase-br] RES: RES: Consulta SQL Parte 2

Alexandre Sousa alexandre.dantas em yahoo.com.br
Ter Out 9 15:35:46 -03 2007


Murilo,

Concordo com você. Sua lógica não está errada.

Tenho selects como essa em várias partes do meu sistema também e nunca 
obtive erros.

Nesse caso não existe necessidade de 2 agrupamentos, pois a lógica que o 
banco segue é:

 - pegue todos os itens de pedido do pedido atual;
 - multiplique a qtde pelo preco de venda
 - some o valor da multiplicação de todos os itens do pedido atual
 - retorne, agrupado por pedido.

Ou seja, só deve ser retorno UM registro por pedido.

Eu particularmente não uso inner join, afinal não faz diferença alguma para 
o plan generator.

select pv.pc_nrped, sum(ip.qt_vend * ip.pedvluni) as vl_tot
from pedven pv
join itemped ip on (ip.pedido = pv.pc_nrped) and (ip.empresa = pv.empresa)

group by pv.pc_nrped

Essa select rodei no ibexpert num banco do meu sistema e funcionou 
perfeitamente.

Confira somente se o campo CODVENDA é realmente a referência para o campo 
codigo da tabela vendas e se a tabela não possui chaves compostas, o que 
poderia afetar o resultado da query.

Espero ter ajudado,

Alexandre Sousa.


----- Original Message ----- 
From: "Murilo" <murilo em conchalnet.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Tuesday, October 09, 2007 2:49 PM
Subject: [firebase-br] RES: RES: Consulta SQL Parte 2


Boa tarde Eduardo,

Tenho minhas dúvidas quanto a minha lógica estar errada, pois na consulta
abaixo eu obtenho um resulta exato, independentemente da quantidade de
registros na tabela ITENS.

SELECT
VENDAS.CODIGO,
SUM(ITENS.PRECOVENDA * ITENS.QUANTIDADE) FROM VENDAS INNER JOIN ITENS ON
VENDAS.CODIGO = ITENS.CODVENDA GROUP BY VENDAS.CODIGO ORDER BY
VENDAS.CODIGO.

Tenho inúmeras consultas como esta na geração de relatórios de meu sistema.
Utilizo-as para pode gerar um relatório de todas as vendas que possuem
determinado produto, por exemplo. Consulta como a abaixo também funciona
perfeitamente bem, onde eu exibo a mesma informação acima, porém agrupada
por cliente.

SELECT
VENDAS.CODCLIE,
CLIENTES.NOME,
SUM(ITENS.PRECOVENDA * ITENS.QUANTIDADE) FROM VENDAS INNER JOIN CLIENTES ON
VENDAS.CODCLIE = CLIENTES.CODIGO INNER JOIN ITENS ON
VENDAS.CODIGO=ITENS.CODVENDA GROUP BY VENDAS.CODCLIE, CLIENTES.NOME ORDER BY
CLIENTES.NOME

Como você me explica o funcionamento destas instruções SQL? Além do mais, o
objetivo da cláusula GROUP BY é justamente este, levando ainda em
consideração que o desempenho da query desta forma fica bem melhor do que
com sub consultas

Obrigado pela ajuda e grande abraço

Murilo ABCS Informática/Conchalnet
Rua das Angélicas, 622 - Centro
Conchal/SP - CEP 13835-000
www.abcsinformatica.com.br
www.conchalnet.com.br


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Eduardo Jedliczka (TeamFB)
Enviada em: terça-feira, 9 de outubro de 2007 13:52
Para: FireBase
Assunto: Re: [firebase-br] RES: Consulta SQL Parte 2

Sua lógica está errada...

Se você faz um select com a tabela pai e tem um join com a tabela filha
(granularidades diferentes) sempre irá pegar a menor, ou seja, a quantidade
da filha...

Nestes casos, faça o select principal apenas pela tabela PAI, e faça
sub-queryes para as totalizações. ou se desejar, escreva uma Stored
Procedure.

SELECT
  Vendas.Codigo,
  Vendas.Data,
  Vendas.CodClie,
  (select  SUM( Itens.Quantidade * Itens.PrecoVenda ) from Itens where
Vendas.Codigo = Itens.CodVenda) AS TotVenda,
  (select  SUM( Itens.Quantidade * Itens.PrecoCusto )  from Itens where
Vendas.Codigo = Itens.CodVenda) AS TotCusto,
  (Select SUM( Extras.Valor ) From Extras Where Vendas.Codigo =
Extras.CodVenda) AS TotCustoExtra
FROM Vendas
ORDER BY Vendas.Codigo

Sucesso,

Eduardo Jedliczka
Membro do TeamFB

----- Original Message ----- 
From: "Murilo" <murilo em conchalnet.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Tuesday, October 09, 2007 1:22 PM
Subject: [firebase-br] RES: Consulta SQL Parte 2


Kleber Agradeço a dica, mas também não funcionou, já havia tentado desta
forma, quando por exemplo a 3 itens ele multiplica por três.
Mas Agradeço a dica.

Aguardo se Alguém tiver alguma idéia, ou sugestão
Obrigado!

Murilo ABCS Informática/Conchalnet
Rua das Angélicas, 622 - Centro
Conchal/SP - CEP 13835-000
www.abcsinformatica.com.br
www.conchalnet.com.br


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Kleber Caneva
Enviada em: terça-feira, 9 de outubro de 2007 11:27
Para: FireBase
Assunto: Re: [firebase-br] Consulta SQL Parte 2

Se eu entendi o que você quer, é só fazer assim:

SELECT
  Vendas.Codigo,
  Vendas.Data,
  Vendas.CodClie,
  SUM( Itens.Quantidade * Itens.PrecoVenda ) AS TotVenda,
  SUM( Itens.Quantidade * Itens.PrecoCusto ) AS TotCusto,
  (Select SUM( Extras.Valor ) From Extras Where Vendas.Codigo =
Extras.CodVenda) AS TotCustoExtra
FROM Vendas
INNER JOIN Itens ON Vendas.Codigo = Itens.CodVenda
GROUP BY Vendas.Codigo, Vendas.Data, Vendas.CodClie
ORDER BY Vendas.Codigo

[]´s

Kléber Caneva

----- Original Message ----- 
From: "Murilo" <murilo em conchalnet.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Tuesday, October 09, 2007 10:29 AM
Subject: [firebase-br] Consulta SQL Parte 2


Fiz meu SQL da seguinte forma:



SELECT

Vendas.Codigo,

Vendas.Data,

Vendas.CodClie,

SUM( Itens.Quantidade * Itens.PrecoVenda ) AS TotVenda,

SUM( Itens.Quantidade * Itens.PrecoCusto ) AS TotCusto,

SUM( Extras.Valor ) AS TotCustoExtra

FROM Vendas INNER JOIN Itens ON Vendas.Codigo = Itens.CodVenda INNER

JOIN Extras ON Vendas.Codigo = Extras.CodVenda

GROUP BY Vendas.Codigo, Vendas.Data, Vendas.CodClie

ORDER BY Vendas.Codigo



Meu problema é o seguinte:

Se a tabela de CUSTOS EXTRAS tiver 10 registros, os resultados das somas

são multiplicados por 10. Por exemplo, se o resultado correto da soma do

campo TotVenda seria 100,00, esta instrução SQL acima retorna para mim

R$1.000,00 caso existam 10 registros na tabela de CUSTOS EXTRAS. O mesmo

ocorre com a soma do campo TotCusto.



Já tentei de tudo, mas não obtive nenhum sucesso. Ao meu entender este

select não deveria ter este comportamento, que está errado, pois estou

agrupando ele



Sei que alguém vai perguntar: "Porque uma chave estrangeira na tabela de

Custos Extras apontando para a tabela de Itens?" - Resposta: É para a

manutenção desta tabela, pois sempre que um item é adicionado na tabela

de itens um Trigger gera os custo extras de cada item. Também poderei

utilizar este campo para a emissão de um relatório agrupado por produto.



será que poderia ser algum BUG? não consegui enteder o porque retornaria

dessa forma....



[]'s



Agradeço atencipadamente a ajuda de todos.



Murilo ABCS Informática/Conchalnet

Rua das Angélicas, 622 - Centro

Conchal/SP - CEP 13835-000

 <http://www.abcsinformatica.com.br> www.abcsinformatica.com.br

www.conchalnet.com.br





______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/cgi-bin/imail.cgi?+_u=kdcc&_l=1,1191939011.642501.2
1104.tacamaca.hst.terra.com.br,5286,Des15,Des15



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.14.6/1059 - Release Date: 9/10/2007
08:44



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.14.6/1059 - Release Date: 9/10/2007
08:44



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista