Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Dúvida sobre o exercício: "Mãos na Massa: total pedidos"

Eu sei que a consulta correta do SQL é essa:
SELECT c.nome AS NomeCliente, SUM(ip.precounitario) AS SomaTotalPedidos
FROM clientes c
INNER JOIN pedidos p
ON c.ID = p.id_cliente
INNER JOIN itensPedidos ip
On p.id = ip.id_pedido
GROUP BY c.Nome;

Pois o exerecício pede para que a consulta seja organizada pelo nome. Mas, porque se eu fizer isso:
SELECT pe.id, cl.nome AS nomeCliente, SUM(ip.precoUnitario) AS valorTotalPedido
FROM clientes cl
JOIN pedidos pe ON cl.id = pe.id_cliente
JOIN itensPedidos ip ON pe.id = ip.id_pedido
GROUP BY pe.id, cl.nome;

O resultado não seria o mesmo?
Percebo que o resultado ele não agrupa todos os pedidos feitos, por exemplo, pelo João, mas ele também não agrupa os pedidos pelo id do João.
A consulta por nome parece mais completa, pois assim sabemos realmente o valor total que cada cliente gastou durante o período que compareceu ao estabelecimento. Gostaria de entender porque a minha consulta não está correta.

Desde já agradeço pela atenção.

1 resposta

Olá, Enzo! Tudo bem?

A diferença entre as duas consultas está na forma como os dados são agrupados.

Na sua primeira consulta:

SELECT c.nome AS NomeCliente, SUM(ip.precounitario) AS SomaTotalPedidos
FROM clientes c
INNER JOIN pedidos p 
ON c.ID = p.id_cliente
INNER JOIN itensPedidos ip
ON p.id = ip.id_pedido
GROUP BY c.Nome;

Você está agrupando os resultados pelo nome do cliente (c.Nome). Isso significa que todos os pedidos de um mesmo cliente serão somados, resultando em uma soma total para cada cliente.

Já na sua segunda consulta:

SELECT pe.id, cl.nome AS nomeCliente, SUM(ip.precoUnitario) AS valorTotalPedido
FROM clientes cl
JOIN pedidos pe ON cl.id = pe.id_cliente
JOIN itensPedidos ip ON pe.id = ip.id_pedido
GROUP BY pe.id, cl.nome;

Você está agrupando os resultados pelo ID do pedido (pe.id) e pelo nome do cliente (cl.nome). Isso significa que a soma será feita para cada pedido individualmente, e não para todos os pedidos de um cliente. É por isso que você vê resultados diferentes, pois cada linha representa um pedido distinto, não o total acumulado por cliente.

Se o seu objetivo é ver o total gasto por cada cliente, a primeira consulta é mais adequada, pois ela agrupa todos os pedidos de um cliente em uma única linha, somando os valores.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado