Considere o seguinte esquema de banco de dados de uma loja virtual:CLIENTE(cliente_id, nome, email, cidade, estado) PEDIDO(pedido_id, cliente_id, data_pedido, valor_total, status)ITEM_PEDIDO(pedido_id, produto_id, quantidade, preco_unitario)PRODUTO(produto_id, nome, categoria, estoque)O gerente de vendas precisa de um relatório que mostre o nome de cada cliente e o valor total de todos os seus pedidos com status 'ENTREGUE', exibindo apenas os clientes que gastaram mais de R$ 1.000,00 no total. O resultado deve ser ordenado do maior para o menor valor gasto.Assinale a opção que apresenta corretamente a consulta SQL que atende corretamente a esse requisito.
ASELECT c.nome, SUM(p.valor_total) AS total_gasto FROM CLIENTE c JOIN PEDIDO p ON c.cliente_id = p.cliente_id WHERE p.status = 'ENTREGUE' GROUP BY c.cliente_id, c.nome HAVING SUM(p.valor_total) > 1000 ORDER BY total_gasto DESC
BSELECT c.nome, SUM(p.valor_total) AS total_gasto FROM CLIENTE c, PEDIDO p WHERE c.cliente_id = p.cliente_id AND SUM(p.valor_total) > 1000 GROUP BY c.nome ORDER BY total_gasto
CSELECT c.nome, p.valor_total AS total_gasto FROM CLIENTE c JOIN PEDIDO p ON c.cliente_id = p.cliente_id WHERE p.status = 'ENTREGUE' AND p.valor_total > 1000 ORDER BY p.valor_total DESC
DSELECT nome, SUM(valor_total) AS total_gasto FROM PEDIDO WHERE status = 'ENTREGUE' GROUP BY cliente_id HAVING total_gasto > 1000 ORDER BY total_gasto DESC
ESELECT c.nome, COUNT(p.valor_total) AS total_gasto FROM CLIENTE c LEFT JOIN PEDIDO p ON c.cliente_id = p.cliente_id GROUP BY c.nome HAVING COUNT(p.valor_total) > 1000
Revelar gabarito e comentário▾
GabaritoA — SELECT c.nome, SUM(p.valor_total) AS total_gasto FROM CLIENTE c JOIN PEDIDO p ON c.cliente_id = p.cliente_id WHERE p.status = 'ENTREGUE' GROUP BY c.cliente_id, c.nome HAVING SUM(p.valor_total) > 1000 ORDER BY total_gasto DESC
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
SQL – Consulta com agregação e filtro
Gabarito: letra A. A consulta correta deve somar o valor_total dos pedidos 'ENTREGUE' de cada cliente, exibir clientes com total > R$ 1.000 e ordenar do maior para o menor. A alternativa A atende todos os requisitos: usa SUM com GROUP BY, filtra com WHERE e HAVING, e ordena com ORDER BY DESC.
A banca testa o conhecimento sobre funções de agregação (SUM), cláusulas GROUP BY, HAVING e a diferença entre WHERE e HAVING. O WHERE filtra linhas antes da agregação; o HAVING filtra grupos após a agregação.
Alternativa
Consulta SQL
Correta?
Motivo
A
SELECT c.nome, SUM(p.valor_total) AS total_gasto FROM CLIENTE c JOIN PEDIDO p ON c.cliente_id = p.cliente_id WHERE p.status = 'ENTREGUE' GROUP BY c.cliente_id, c.nome HAVING SUM(p.valor_total) > 1000 ORDER BY total_gasto DESC
✅ Sim
Usa SUM com GROUP BY, filtra pedidos entregues no WHERE, filtra clientes com total > 1000 no HAVING, e ordena do maior para o menor com ORDER BY DESC.
B
SELECT c.nome, SUM(p.valor_total) AS total_gasto FROM CLIENTE c, PEDIDO p WHERE c.cliente_id = p.cliente_id AND SUM(p.valor_total) > 1000 GROUP BY c.nome ORDER BY total_gasto
❌ Não
SUM não pode ser usado no WHERE (apenas em HAVING); falta filtro status = 'ENTREGUE'; ORDER BY sem DESC ordena ascendente.
C
SELECT c.nome, p.valor_total AS total_gasto FROM CLIENTE c JOIN PEDIDO p ON c.cliente_id = p.cliente_id WHERE p.status = 'ENTREGUE' AND p.valor_total > 1000 ORDER BY p.valor_total DESC
❌ Não
Mostra valor de cada pedido individual, não a soma por cliente; filtra pedidos com valor > 1000, não clientes com total acumulado > 1000.
D
SELECT nome, SUM(valor_total) AS total_gasto FROM PEDIDO WHERE status = 'ENTREGUE' GROUP BY cliente_id HAVING total_gasto > 1000 ORDER BY total_gasto DESC
❌ Não
nome não está na tabela PEDIDO (precisa de JOIN com CLIENTE); HAVING com alias total_gasto pode não ser suportado em todos os SGBDs.
E
SELECT c.nome, COUNT(p.valor_total) AS total_gasto FROM CLIENTE c LEFT JOIN PEDIDO p ON c.cliente_id = p.cliente_id GROUP BY c.nome HAVING COUNT(p.valor_total) > 1000
❌ Não
Usa COUNT em vez de SUM (conta pedidos, não soma valores); falta filtro status = 'ENTREGUE'; LEFT JOIN inclui clientes sem pedidos.
1FROM + JOIN (combina tabelas)
2WHERE (filtra pedidos entregues)
3GROUP BY (agrupa por cliente)
4HAVING (filtra total > R$ 1.000)
5ORDER BY DESC (maior para menor)
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
SELECT c.nome, SUM(p.valor_total) AS total_gasto
FROM CLIENTE c
JOIN PEDIDO p ON c.cliente_id = p.cliente_id
WHERE p.status = 'ENTREGUE'
GROUP BY c.cliente_id, c.nome
HAVING SUM(p.valor_total) > 1000
ORDER BY total_gasto DESC
Utiliza JOIN para combinar as tabelas Cliente e Pedido.
WHERE p.status = 'ENTREGUE' filtra apenas pedidos entregues.
GROUP BY c.cliente_id, c.nome agrupa por cliente (incluir cliente_id evita ambiguidade).
HAVING SUM(p.valor_total) > 1000 filtra os grupos (clientes) cuja soma ultrapassa R$ 1.000,00.
ORDER BY total_gasto DESC ordena do maior para o menor.
Alternativa B — ❌ Incorreta
SELECT c.nome, SUM(p.valor_total) AS total_gasto
FROM CLIENTE c, PEDIDO p
WHERE c.cliente_id = p.cliente_id AND SUM(p.valor_total) > 1000
GROUP BY c.nome
ORDER BY total_gasto
Erro grave:SUM(p.valor_total) não pode ser usada na cláusula WHERE — funções de agregação são permitidas apenas em HAVING ou subconsultas.
Ausência do filtro p.status = 'ENTREGUE' (todos os pedidos seriam considerados).
ORDER BY sem DESC ordena de forma ascendente.
Alternativa C — ❌ Incorreta
SELECT c.nome, p.valor_total AS total_gasto
FROM CLIENTE c
JOIN PEDIDO p ON c.cliente_id = p.cliente_id
WHERE p.status = 'ENTREGUE' AND p.valor_total > 1000
ORDER BY p.valor_total DESC
Mostra o valor de cada pedido individualmente, não a soma por cliente.
O filtro p.valor_total > 1000 seleciona pedidos com valor acima de 1000, não clientes com total acumulado > 1000.
Alternativa D — ❌ Incorreta
SELECT nome, SUM(valor_total) AS total_gasto
FROM PEDIDO
WHERE status = 'ENTREGUE'
GROUP BY cliente_id
HAVING total_gasto > 1000
ORDER BY total_gasto DESC
Não há JOIN com a tabela CLIENTE, portanto a coluna nome não está disponível — provavelmente geraria erro (a coluna nome não existe em PEDIDO).
Mesmo que nome existisse em PEDIDO (o que não é o caso), não seria o nome do cliente.
Alternativa E — ❌ Incorreta
SELECT c.nome, COUNT(p.valor_total) AS total_gasto
FROM CLIENTE c
LEFT JOIN PEDIDO p ON c.cliente_id = p.cliente_id
GROUP BY c.nome
HAVING COUNT(p.valor_total) > 1000
COUNT(p.valor_total) conta o número de pedidos, não soma os valores.
LEFT JOIN inclui clientes sem pedidos (resultando em COUNT = 0), mas isso não é o problema principal.
Ausência do filtro p.status = 'ENTREGUE'.
HAVING COUNT(...) > 1000 é absurdo: nenhum cliente teria mais de 1000 pedidos.
NÃO CAIA NESSA!
A banca explora a diferença entre WHERE e HAVING (alternativa B) e troca SUM por COUNT (alternativa E). Lembre-se: WHERE filtra linhas individuais antes da agregação; HAVING filtra grupos após a agregação. Use SUM para somar valores e COUNT para contar registros.