Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Inner Join somando errado com 2 tabelas ( Esta multiplicando )


anderson810311

Pergunta

Pessoal, 

Tenho duas tabelas:

1º rec_lider
2º rec_fiscal

ambas com dados variados dentro das tabelas, porém preciso buscar três informações entre as duas, vou ver se consigo explicar aqui embaixo, tentei de tudo e não consegui, preciso muito de ajuda nessa soma.

Vamos lá, vou explicar aqui embaixo:

1º Tabela (rec_lider), tenho dentro dela o cd, total_recebido
2º Tabela (rec_fiscal), tenho dentro dela o cd, total_recebimento e total_devolvido

Estou usando o seguinte critério no MySql:

SELECT
rec_lider.cd AS Unidade,
SUM(rec_lider.total_recebido) AS `Total Recebido`,
SUM(rec_fiscal.total_recebimento) AS `Total Auditado`,
SUM(rec_fiscal.total_devolvido) AS `Total Devolvido`
FROM rec_lider
INNER JOIN rec_fiscal ON rec_lider.cd = rec_fiscal.cd
GROUP BY rec_lider.cd

As informações estão vindo, porém esta multiplicando e ficando muito maior que o correto, tipo vou no banco conto a quantidade por exemplo de "total_recebido = 10" so que neste critério acima ele me retorno tipo "total_recebido = 110" por exemplo", já tentei de tudo não consegui um jeito de fazer correto, gostaria de pedir uma ajuda aqui para este meu problema que acredito ser bem simples, más não estou conseguindo de jeito nenhum.

Postei esse mesma dificuldade em outro fórum "Ao Calcular Valores ou Quantidade o banco multiplica pela quantidade de registro - Ajuda" porém uma pessoa tentou me ajudar más não consegui fazer oque ele pediu dar certo, segui os passos dele más não retornou correto a tabela.

Alguém aqui pode me ajudar, por favor?

Obrigado.

 

 

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Conforme mostra a imagem que você postou no outro site e que tomei a liberdade de postar aqui,

tabelas.png

Isto acontece por causa do join que você está impondo em seu select .

Segundo a estrutura de suas tabelas, cada elemento de rec_lider apontará para vários elementos de rec_fiscal que correspondam a igualdade rec_lider.cd = rec_fiscal.cd.

Exemplo: Tomando cd = Osasco, O primeiro registro de rec_lider(Osasco, 20) apontará para os seguintes registros em rec_fiscal (Osasco 20),((Osasco 30), Osasco, 40) e (Osasco, 20); O registro (Osasco, 30) em rec_fiscal apontará para os mesmos registros em rec_fiscal e etc.

A solução é somar  rec_lider antes de conectar o join. Somar os dados de rec_fiscal, também, antes de  conectar o join. E realizar um join para exibir os totais.

Por que fazer assim?

Porque assim, assim rec_fiscal.cd terá somente um registro por cd, assim como rec_lider.cd

Então teremos:

SELECT Unidade, `Total Recebido`, `Total Auditado`, `Total Devolvido`
FROM (SELECT rec_lider.cd AS Unidade,
   SUM(rec_lider.total_recebido) AS `Total Recebido`,
   FROM rec_lider
   GROUP BY rec_lider.cd
) rl
INNER JOIN (SELECT rec_fiscal.cd AS Unidade,
   SUM(rec_fiscal.total_recebimento) AS `Total Auditado`,
   SUM(rec_fiscal.total_devolvido) AS `Total Devolvido`
   FROM rec_fiscal
   GROUP BY rec_fiscal.cd
) rf ON rf.Unidade = rc.Unidade
GROUP BY rl.Unidade

 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 07/11/2016 at 19:04, Denis Courcy disse:

Conforme mostra a imagem que você postou no outro site e que tomei a liberdade de postar aqui,

tabelas.png

Isto acontece por causa do join que você está impondo em seu select .

Segundo a estrutura de suas tabelas, cada elemento de rec_lider apontará para vários elementos de rec_fiscal que correspondam a igualdade rec_lider.cd = rec_fiscal.cd.

Exemplo: Tomando cd = Osasco, O primeiro registro de rec_lider(Osasco, 20) apontará para os seguintes registros em rec_fiscal (Osasco 20),((Osasco 30), Osasco, 40) e (Osasco, 20); O registro (Osasco, 30) em rec_fiscal apontará para os mesmos registros em rec_fiscal e etc.

A solução é somar  rec_lider antes de conectar o join. Somar os dados de rec_fiscal, também, antes de  conectar o join. E realizar um join para exibir os totais.

Por que fazer assim?

Porque assim, assim rec_fiscal.cd terá somente um registro por cd, assim como rec_lider.cd

Então teremos:


SELECT Unidade, `Total Recebido`, `Total Auditado`, `Total Devolvido`
FROM (SELECT rec_lider.cd AS Unidade,
   SUM(rec_lider.total_recebido) AS `Total Recebido`,
   FROM rec_lider
   GROUP BY rec_lider.cd
) rl
INNER JOIN (SELECT rec_fiscal.cd AS Unidade,
   SUM(rec_fiscal.total_recebimento) AS `Total Auditado`,
   SUM(rec_fiscal.total_devolvido) AS `Total Devolvido`
   FROM rec_fiscal
   GROUP BY rec_fiscal.cd
) rf ON rf.Unidade = rc.Unidade
GROUP BY rl.Unidade

 

Denis, boa tarde.

Desculpe dar o retorno agora, consegui entrar agora aqui no fórum, porém fiz oque você me pediu e não consegui, coloquei direto no phpmyadmin porém não deu certo.

Pode me ajudar e me mostrar aonde errei?

coloquei esta ajuda também em outro fórum, e coloquei os bds para testes, vou colocar aqui também.

http://www.logsystem.com.br/forum/rec_fiscal.sql

http://www.logsystem.com.br/forum/rec_lider.sql

pode me ajudar mais uma vez por favor.

 

Obrigado.

 

Link para o comentário
Compartilhar em outros sites

  • 0

Em minha base de teste criei as tabelas abaixo e populei conforme a imagem que você forneceu:

CREATE TABLE rec_lider(
cd VARCHAR(30),
totalRecebido INTEGER)
;
INSERT INTO rec_lider(cd,totalrecebido)
VALUES('OSASCO',20),
('CAJAMAR',10),
('são PAULO',15),
('OSASCO',30),
('OSASCO',40),
('JUNDIAI',50),
('RECIFE',10),
('RECIFE',40),
('OSASCO',20),
('CAJAMAR',30)
;
CREATE TABLE rec_fiscal(
cd VARCHAR(30),
totalRecebimento INTEGER)
;
INSERT INTO rec_fiscal(cd,totalrecebimento)
VALUES('OSASCO',20),
('CAJAMAR',10),
('são PAULO',15),
('OSASCO',30),
('OSASCO',40),
('JUNDIAI',50),
('RECIFE',10),
('RECIFE',40),
('OSASCO',20),
('CAJAMAR',30)
;

Executei o select abaixo:


SELECT rl.Unidade, `Total Recebido`, `Total Recebimento`
FROM (SELECT cd AS Unidade,
   SUM(total_recebido) AS `Total Recebido`
   FROM rec_lider
   GROUP BY cd
) rl
INNER JOIN (SELECT cd AS Unidade,
   SUM(total_recebimento) AS `Total Recebimento`
   FROM rec_fiscal
   GROUP BY cd
) rf ON rf.Unidade = rl.Unidade
GROUP BY rl.Unidade
;

 

Link para o comentário
Compartilhar em outros sites

  • 0
21 minutos atrás, Denis Courcy disse:

Em minha base de teste criei as tabelas abaixo e populei conforme a imagem que você forneceu:


CREATE TABLE rec_lider(
cd VARCHAR(30),
totalRecebido INTEGER)
;
INSERT INTO rec_lider(cd,totalrecebido)
VALUES('OSASCO',20),
('CAJAMAR',10),
('são PAULO',15),
('OSASCO',30),
('OSASCO',40),
('JUNDIAI',50),
('RECIFE',10),
('RECIFE',40),
('OSASCO',20),
('CAJAMAR',30)
;
CREATE TABLE rec_fiscal(
cd VARCHAR(30),
totalRecebimento INTEGER)
;
INSERT INTO rec_fiscal(cd,totalrecebimento)
VALUES('OSASCO',20),
('CAJAMAR',10),
('são PAULO',15),
('OSASCO',30),
('OSASCO',40),
('JUNDIAI',50),
('RECIFE',10),
('RECIFE',40),
('OSASCO',20),
('CAJAMAR',30)
;

Executei o select abaixo:



SELECT rl.Unidade, `Total Recebido`, `Total Recebimento`
FROM (SELECT cd AS Unidade,
   SUM(total_recebido) AS `Total Recebido`
   FROM rec_lider
   GROUP BY cd
) rl
INNER JOIN (SELECT cd AS Unidade,
   SUM(total_recebimento) AS `Total Recebimento`
   FROM rec_fiscal
   GROUP BY cd
) rf ON rf.Unidade = rl.Unidade
GROUP BY rl.Unidade
;

 

Denis, Muitooooo Obrigado!.

Estava já umas 3 a 4 semanas nisso e nada de concluir por esta dificuldade, fico hiper agradecido com essa sua contribuição e solução, me ajudou e muito!

Aqui deu tudo certinho, agora consegui, :)

Parabéns pelo seu empenho em ajudar pessoas como eu que não entende muito, rsrs

Valeu mesmo.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...