Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cesão

relacionamento de diversas tabelas com Inner Join, Count e Sum

Recommended Posts

Olá amigos.. tenho um banco de dados ACCESS e tenho as seguintes tabelas com os seguintes campos...PRODUTOSid | nome | precoCLIENTESid | nomePEDIDOSnumero_pedido | id_cliente (id do cliente) | cod_item (id do produto) | quantidadegostaria de relacionar tais tabelas para que no resultado aparecesse a listagem de todos os clientes (while) desta forma:Nome: José da Silva - Total de gastos: R$ 1.200,00 - Total de Pedidos: 10 pedidos.mas para isso eu teria que relacionar as tabelas, multiplicar a soma dos preços dos produtos pela soma das quantidades e nao sei como relacionar tudo isso...antes eu fazia relacionamentos de tabela assim:SQL = "SELECT * FROM tabela a, tabela b WHERE a.id=b.id"mas me disseram que o certo eh com INNER JOIN e o resto eh gambiarra...entao, como faço p relacionar as tabelas p dar o resultado acima? pq nem do jeito antigo (gambiarra) eu consegui...não se sei fica mais facil fazer 2 SQL e 2 while.. alguem me ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que seria necessarios 3 sql's, o primeiro pegando os clientes, dentro do while do cliente voce pegaria a quantidade dos produtos da tabela pedido e faria o join com a tabela produtos pegando o preco, dentro dele voce faz o count na tabela pedidos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas como eu faria p ordenar? pq eu quero que a ordem seja dos que fizeram mais pedidos pros que fizeram menos pedidos.. um TOP 5

Compartilhar este post


Link para o post
Compartilhar em outros sites

eh esse que eh o problema cara.. eu usava antes aquele modelo meio gambiarra sabe? que citei no topico...pq com inner join nao sei mexer direito.. teria como você me dar uma ajuda?pq nao sei pra que serve o GROUP BY, o que colocar la, nao sei como fazer um WHERE cliente.id="&rs("id_cliente") pq sempre dah pau...tem como me dar uma ajuda mais especifica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria mais ou menos assim:

'Seleciona o cliente e a quantidade de pedidos que ele fezSet rsPedHdr = oCnn.Execute("Select id_cliente, tot_pedido From (Select id_cliente, count(numero_pedido) As tot_pedido From Pedidos Group By id_cliente) Order By tot_pedido Desc")'Checa se retornou algoIf Not rsPedHdr.EOF Then   'Vai para o primeiro registro   rsPedHdr.MoveNext   'Percorre os registros   Do While Not rsPedHdr.EOF	  Set rsPed = oCnn.Execute("Select Pedidos.cod_item, Pedidos.quantidade, Produtos.preco From Pedidos Inner Join Produtos On Pedidos.cod_item = Produtos.id Where Pedidos.id_cliente = " & rsPedHdr("id_cliente"))	  If Not rsPed.EOF Then		 rsPed.MoveFirst		 lSub = 0		 Do While Not rsPed.EOF			lSub = lSub + (CLng(rsPed("quantidade"))*CLng(rsPed("preco")))		 Loop	  End If	  Set rsCli = oCnn.Execute("Select nome From Clientes Where id = " & rsPedHdr("id_cliente"))	  Response.Write "Nome: " & rsCli("nome") & " - " & vbCrLf & _							 "Total de gastos: " & FormatCurrency(lSub) & " - " & vbCrLf & _							 "Total de pedidos: " & rsPedHdr("tot_pedido")   LoopEnd If
Testa ai e posta o resultado, quase certeza que vai dar pau, fiz de cabeça, ta uma olhada se os nomes dos campos e das tabelas estão corretos e manda bala.

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse que você me passou não deu certo... coloquei na minha pagina, ajustei com os nomes certos e ele fica carregando ateh expirar o tempo.. nao deu certo..alguem pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltaram alguns MoveNext, tenta assim:

'Seleciona o cliente e a quantidade de pedidos que ele fezSet rsPedHdr = oCnn.Execute("Select id_cliente, tot_pedido From (Select id_cliente, count(numero_pedido) As tot_pedido From Pedidos Group By id_cliente) Order By tot_pedido Desc")'Checa se retornou algoIf Not rsPedHdr.EOF Then   'Vai para o primeiro registro   rsPedHdr.MoveFirst   'Percorre os registros   Do While Not rsPedHdr.EOF	  Set rsPed = oCnn.Execute("Select Pedidos.cod_item, Pedidos.quantidade, Produtos.preco From Pedidos Inner Join Produtos On Pedidos.cod_item = Produtos.id Where Pedidos.id_cliente = " & rsPedHdr("id_cliente"))	  If Not rsPed.EOF Then		 rsPed.MoveFirst		 lSub = 0		 Do While Not rsPed.EOF			lSub = lSub + (CLng(rsPed("quantidade"))*CLng(rsPed("preco")))			rsPed.MoveNext		 Loop	  End If	  Set rsCli = oCnn.Execute("Select nome From Clientes Where id = " & rsPedHdr("id_cliente"))	  Response.Write "Nome: " & rsCli("nome") & " - " & vbCrLf & _							 "Total de gastos: " & FormatCurrency(lSub) & " - " & vbCrLf & _							 "Total de pedidos: " & rsPedHdr("tot_pedido")	  rsPedHdr.MoveNext   LoopEnd If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow Anderson.. ce mando MTO bem cara! hahahahato atrás disso há muito tempo.. vou dar uma estudada no código que você me mandou aqui... eu nao conheço mto bem esse jeito de fazer select (com um dentro do outro literalmente), mas deve ser mais ou menos o mesmo jeito que eu faço não é?SQL = "SELECT * FROM tabela a, tabela b WHERE a.id=b.id"Valew cara! funcionou certinho!Abraços(se alguém puder mostrar aqui como reproduzir esse mesmo código, mas da maneira que eu faço mostrada acima ou com INNER JOIN, acho que o tópico ficaria mais completo ainda!)ah, e Anderson.. me explica uma coisa.. pra que serve o GROUP BY?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, soh arrumei um negocio aki...você tinha colocado:lSub = lSub + (CLng(rsPed("quantidade"))*CLng(rsPed("preco")))mas na verdade tinha que ser:lSub = lSub + (CLng(rsPed("quantidade"))*formatnumber(rsPed("preco"),2))senao o resultado saia errado.. valew cara!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, que bom que deu certo.Respondendo a sua pergunta o Goup By agrupa os resultados, se você tem uma tabela que repete os clientes, como é o caso, e você quer contar quantas vezes ele aparece, este é um jeito bem fácil.;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.