SELECT
c.Cidade
, (
SELECT
SUM(e.Valor)
FROM tabelaemprestimo AS e
WHERE 1=1
AND e.id_cliente = c.id_cliente
) AS valor_total_emprestimos
FROM tabelaclientes AS c
WHERE 1=1
;
SELECT
c.Cidade
, (
SELECT
SUM(e.Valor)
FROM tabelaemprestimo AS e
WHERE 1=1
AND e.id_cliente = c.id_cliente
) AS valor_total_emprestimos
FROM tabelaclientes AS c
WHERE 1=1
;
Olá, Carlos Eduardo! Tudo bem?
Mais uma resolução impecável! Você utilizou uma subconsulta correlacionada no SELECT para agregar valores de uma tabela secundária (tabelaemprestimo) baseando-se em um atributo da tabela primária (tabelaclientes).
Esta abordagem é muito interessante para gerar relatórios rápidos onde você precisa manter a estrutura da tabela de clientes enquanto traz cálculos totalizados.
SUM(e.Valor) dentro da subconsulta vinculada pelo id_cliente, você consegue consolidar o montante financeiro por registro de forma granular.WHERE 1=1, que já se tornou sua marca registrada de boas práticas de engenharia.Como você é Tech Lead, sabe que subconsultas correlacionadas no SELECT executam a subquery para cada linha retornada pela consulta principal.
Para este exercício específico, o resultado é perfeito. No entanto, se o objetivo final é agrupar o valor total por cidade (e não por cliente individual exibindo a cidade), uma alternativa performática para grandes volumes de dados seria o uso de um JOIN com GROUP BY:
SELECT
c.Cidade
, SUM(e.Valor) AS valor_total_emprestimos
FROM tabelaclientes AS c
INNER JOIN tabelaemprestimo AS e ON c.id_cliente = e.id_cliente
GROUP BY c.Cidade;
Essa mudança transformaria a operação de "linha a linha" em uma operação de conjunto (set-based), o que geralmente é mais eficiente em bancos de dados relacionais.
Parabéns por mais essa entrega e por continuar elevando o nível das discussões no fórum com seus 58.6k de XP!
Espero que possa ter lhe ajudado!
Na sua experiência, você costuma encontrar muitos casos onde a subconsulta no SELECT é preferível ao GROUP BY por questões de regras de negócio específicas ou legibilidade do código para o time?