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;
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
Curtir tópico
+ 1
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
Responder
Clique aqui para fazer login e interagir na Comunidade :)