Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2026

Banco de DadosSQL
Código
fg129164
Banca
FGV
Órgão
AMAZUL
Ano
2026
Nível
Superior
Cargo
Engenheiro de Computação
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.
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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.

  1. 1FROM + JOIN (combina tabelas)
  2. 2WHERE (filtra pedidos entregues)
  3. 3GROUP BY (agrupa por cliente)
  4. 4HAVING (filtra total > R$ 1.000)
  5. 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.

Link permanente: /questoes/fg129164