MySQL - Select com subconsultas retornando registros duplicados

24/11/2018

0

O código a seguir precisa buscar o nome do banco, número da agência, número da conta, nome do cliente etc. Porém, ele seleciona o mesmo cliente e mostra todos os registros milhares de vezes, gostaria de saber como corrigir. Segue imagem do que o código retorna: http://prntscr.com/lmguac

select banco.nome_ban as 'Nome do Banco', agencia.numero_ag as 'Número da Agência', conta_corrente.numero_cc as 'Número da Conta', cliente.nome_cli as 'Nome do Cliente',
(select count(valor_dep) from deposito where deposito.cod_cc_fk = conta_corrente.cod_cc) as 'Quantidade de Depósitos Realizados',
(select sum(round(valor_dep, 2)) from deposito where deposito.cod_cc_fk = conta_corrente.cod_cc) as 'Soma dos Depósitos Realizados',
(select count(valor_saq) from saque where saque.cod_cc_fk = conta_corrente.cod_cc) as 'Quantidade de Saques Realizados',
(select sum(round(valor_saq, 2)) from saque where saque.cod_cc_fk = conta_corrente.cod_cc) as 'Soma dos Saques Realizados',
(select count(valor_pag) from pagamento where pagamento.cod_cc_fk = conta_corrente.cod_cc) as 'Quantidade de Pagamentos Realizados',
(select sum(round(valor_pag, 2)) from pagamento where pagamento.cod_cc_fk = conta_corrente.cod_cc) as 'Soma dos Pagamentos Realizados' from conta_corrente
inner join cliente on conta_corrente.cod_cli_fk = cliente.cod_cli inner join agencia inner join banco on agencia.cod_ban_fk = banco.cod_ban
order by (select sum(round(valor_saq, 2)) from saque where saque.cod_cc_fk = conta_corrente.cod_cc) desc;
André Mendes

André Mendes

Responder

Post mais votado

26/11/2018

falta fazer o relacionamento correto com a tabela agencia. também alterei a forma como estavam sendo obtidos os valores.
select
  bco.nome_ban as 'Nome do Banco',
  age.numero_ag as 'Número da Agência',
  cc.numero_cc as 'Número da Conta',
  cli.nome_cli as 'Nome do Cliente',
  coalesce(dep.deposito_qtd,0) as 'Quantidade de Depósitos Realizados',
  coalesce(dep.deposito_valor,0) as 'Soma dos Depósitos Realizados',
  coalesce(saq.saque_qtd,0) as 'Quantidade de Saques Realizados',
  coalesce(saq.saque_valor,0) as 'Soma dos Saques Realizados',
  coalesce(pag.pagamento_qtd,0) as 'Quantidade de Pagamentos Realizados',
  coalesce(pag.pagamento_valor,0) as 'Soma dos Pagamentos Realizados'
from
  cliente cli
inner join conta_corrente cc
  on cc.cod_cli_fk = cli.cod_cli
inner join agencia age
  on age.numero_ag = cc.num_ag_fk -- aqui não havia informação de como relacionar a tabela
inner join banco bco
  on bco.cod_ban = age.cod_ban_fk
left join
  (select cod_cc_fk, count(valor_dep) deposito_qtd, sum(round(valor_dep, 2)) deposito_valor
   from deposito group by cod_cc_fk) dep on dep.cod_cc_fk = cc.cod_cc
left join
  (select cod_cc_fk, count(valor_saq) saque_qtd, sum(round(valor_saq, 2)) saque_valor
   from saque group by cod_cc_fk) saq on saq.cod_cc_fk = cc.cod_cc
left join
  (select cod_cc_fk, count(valor_pag) pagamento_qtd, sum(round(valor_pag, 2)) pagamento_valor
   from pagamento group by cod_cc_fk) pag on pag.cod_cc_fk = cc.cod_cc
order by
  coalesce(saq.saque_valor,0) desc

Emerson Nascimento

Emerson Nascimento
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar