Tenho essas duas tabelas abaixo
en_cliente
en_aluguel
Preciso fazer uma uma query que selecione os clientes com a quantidade de alugueis realizados e total gasto por ano
para ficar assim:
Tenho essas duas tabelas abaixo
Preciso fazer uma uma query que selecione os clientes com a quantidade de alugueis realizados e total gasto por ano
para ficar assim:
Isso é muito simples, acho que você consegue sem alguém te dar a resposta pronta
Pesquise sobre JOIN para fazer a junção das tabelas e SUM para fazer a soma.
então, estou vendo sobre isso mesmo, mas não estou conseguindo agrupar pq preciso fazer o total de alugueis e a soma deles por ano, até agora cheguei a esse estado
com essa query:
SELECT cli.id_cliente as id_cliente, cliente.nome as nome, count(aluguel.id_cliente) as alugueis, SUM(aluguel.valor) as valor,
aluguel.data_aluguel as ano
FROM en_aluguel aluguel
LEFT JOIN en_cliente cliente ON(aluguel.id_cliente = cliente.id_cliente)
LEFT JOIN en_cliente cli ON(aluguel.id_cliente = cli.id_cliente)
GROUP BY aluguel.data_aluguel, cli.id_cliente, cliente.nome, aluguel.valor
ORDER BY aluguel.data_aluguel;
SELECT cli.id_cliente as id_cliente, cliente.nome as nome, count(aluguel.id_cliente) as alugueis, SUM(aluguel.valor) as valor,
aluguel.data_aluguel as ano
FROM en_aluguel aluguel
LEFT JOIN en_cliente cliente ON(aluguel.id_cliente = cliente.id_cliente)
LEFT JOIN en_cliente cli ON(aluguel.id_cliente = cli.id_cliente) Não tem porque criar 2 join
GROUP BY aluguel.data_aluguel, cli.id_cliente, cliente.nome, aluguel.valor Não tem porque agrupar por id cliente e pelo nome, pois o ID do cliente deve corresponder ao nome do cliente, além disso não tem porque agrupar por valor.
ORDER BY aluguel.data_aluguel;
Se atente também, que no resultado esperado ele mostra apenas o ano, então você tem que fazer um agrupamento por ano e não por data, já que se você tivesse as datas 01/01/2020 e 25/01/2020 ele apareceriam separados e não como é esperado.
Veja se essa query funciona:
SELECT
cli.id_cliente,
cliente.nome,
COUNT(aluguel.id_aluguel) AS alugueis,
SUM(aluguel.valor) AS valor,
EXTRACT(YEAR FROM aluguel.data_aluguel) AS ano
FROM
en_cliente cliente
LEFT JOIN en_aluguel aluguel ON aluguel.id_cliente = cliente.id_cliente
GROUP BY
cli.id_cliente,
cliente.nome,
EXTRACT(YEAR FROM aluguel.data_aluguel)
ORDER BY
aluguel.data_aluguel;
Oi pessoal, muito obrigado @Rodrigomarden pelas suas dicas eu estava chegando próximo do resultado final e consegui ajustar corretamente junto a resposta do @Lucas_Camara, por fim a query ficou assim:
SELECT
cliente.id_cliente,
cliente.nome,
COUNT(aluguel.id_aluguel) AS alugueis,
SUM(aluguel.valor) AS valor,
EXTRACT(YEAR FROM aluguel.data_aluguel) AS ano
FROM
en_cliente cliente
LEFT JOIN en_aluguel aluguel ON aluguel.id_cliente = cliente.id_cliente
GROUP BY
cliente.id_cliente,
cliente.nome,
aluguel.data_aluguel
ORDER BY
valor DESC;
Resultando na tabela
Só uma última duvida, tem algum comando que coloco como parâmetro ao count que ele pega somente contagem > 0? para tirar a primeira linha que não possui alugueis por exemplo
Use o having (depois do group by).
HAVING COUNT(aluguel.id_aluguel) > 0