4
respostas

Interpretação

Eu fiquei confuso com a solução apresentada pelo instrutor. O enunciado diz: "... Para isso, é necessário calcular a quantidade de empréstimos ativos de cada cliente e ordenar os resultados de forma decrescente." Não consegui entender como o calculo e a ordenação estão sendo feitos no soluão proposta. Segue minha solução.

SELECT
    nome,
    (SELECT COUNT(*) FROM TabelaEmprestimo te WHERE te.Status = 1 AND tc.id_cliente = te.id_cliente) as quatidadeEmprestimo
FROM TabelaClientes tc
WHERE quatidadeEmprestimo <> 0
ORDER BY quatidadeEmprestimo DESC;
4 respostas

Bom dia, amigo!

Quando você usa uma subconsulta, esse valor está sendo calculado naquele momento apenas para ser projetado no resultado, e não existe na sua tabela original para que possa ser filtrado diretamente. Ou seja, falando de forma prática, quantidadeEmprestimo não pode ser filtrado no WHERE, já que ele não pertence à tabela TabelaClientes. Contudo, existem algumas alternativas que você pode utilizar.

SELECT
    nome,
    (SELECT COUNT(*) 
     FROM TabelaEmprestimo te 
     WHERE te.Status = 1 AND tc.id_cliente = te.id_cliente) AS quantidadeEmprestimo
FROM TabelaClientes tc
WHERE   
    (SELECT COUNT(*) 
     FROM TabelaEmprestimo te 
     WHERE te.Status = 1 AND tc.id_cliente = te.id_cliente) <> 0
ORDER BY quantidadeEmprestimo DESC;

⚠️ Lembrando que a forma acima não é muito eficiente, já que o banco precisa recalcular a mesma subconsulta mais de uma vez, o que pode trazer problemas de desempenho e escalabilidade. ex2:

SELECT 
    tc.nome,
    COUNT(*) AS quantidadeEmprestimo
FROM 
    TabelaClientes tc
INNER JOIN 
    TabelaEmprestimo te ON tc.id_cliente = te.id_cliente
WHERE 
    te.Status = 1
GROUP BY 
    tc.nome
ORDER BY 
    quantidadeEmprestimo DESC;

Esse segundo exemplo é mais performático, especialmente em bancos com grande volume de dados, e funciona muito bem quando você só precisa de clientes que realmente tenham empréstimos com Status = 1.

Olá Isaac. Obrigado pela resposta. Entendi perfeitamente sua colocação. Minha dúvida é: onde está sendo feito esse calculo na solução proposta pelo instrutor? Segue a solução proposta pelo instrutor.

SELECT 
    Nome
FROM 
    TabelaClientes c
WHERE 
    EXISTS (
        SELECT 1 
        FROM TabelaEmprestimo e 
        WHERE e.id_cliente = c.id_cliente AND e.Status = 1
    );

Bom dia, Wagner Gaspar! Realmente na resposta do instrutor tem um problema, ele não ordena, nem disponibiliza a quantidade! Apenas retornando os nomes dos clientes que possuem pelo menos um empréstimo com status 1.

Joia Isaac, achei que eu que não estava entendendo ao solução dele rsrsrs. Obrigado.