Considere a tabela VENDAS(id venda, vendedor, valor) em um banco de dados MySQL. Um analista deseja obter exclusivamente o nome do vendedor com o maior valor total de vendas, considerando que pode haver empate entre vendedores. Assinale a consulta SQL que atende corretamente ao objetivo.
ASELECT vendedorFROM vendasGROUP BY vendedorORDER BY SUM(valor) DESCLIMIT 1;
B
C
DSELECT vendedor, MAX(SUM(valor))FROM vendasGROUP BY vendedor;
E
Revelar gabarito e comentário▾
GabaritoB — [imagem]
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 para obter o vendedor com maior valor total de vendas (considerando empates)
Gabarito: letra B — A consulta correta deve usar uma subconsulta para encontrar o maior valor total de vendas e depois selecionar os vendedores cuja soma seja igual a esse máximo, garantindo que todos os vendedores empatados sejam retornados.
A banca testa o conhecimento sobre funções de agregação, agrupamento e o tratamento de empates. O enunciado deixa claro que pode haver empate, então soluções com LIMIT 1 ou MAX aplicado diretamente sobre a soma não funcionam.
Alternativa
Consulta SQL
Funciona?
Trata empates?
Motivo
A
SELECT vendedor FROM vendas GROUP BY vendedor ORDER BY SUM(valor) DESC LIMIT 1;
❌
❌
LIMIT 1 retorna apenas um vendedor, ignorando empates.
B
Subconsulta: SELECT vendedor FROM vendas GROUP BY vendedor HAVING SUM(valor) = (SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS sub);
✅
✅
Filtra grupos cuja soma é igual ao maior total, retornando todos os empatados.
C
(Não especificada)
❌
❌
Provável erro semântico ou sintático (ex.: HAVING sem GROUP BY).
D
SELECT vendedor, MAX(SUM(valor)) FROM vendas GROUP BY vendedor;
❌
❌
MAX(SUM(valor)) é inválido (aninhamento de agregações proibido).
1Agrupar por vendedor
2Calcular SUM(valor) por grupo
3Encontrar o MAX(total)
4Filtrar grupos com SUM = MAX
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
SELECT vendedor
FROM vendas
GROUP BY vendedor
ORDER BY SUM(valor) DESC
LIMIT 1;
O uso de LIMIT 1 resolve o problema do maior valor, mas desconsidera empates: se dois ou mais vendedores tiverem o mesmo total máximo, apenas um será retornado. A cláusula LIMIT é aplicada após a ordenação e simplesmente corta as primeiras linhas, independentemente de existirem valores iguais. Portanto, não atende ao requisito de considerar possíveis empates.
Alternativa B — ✅ Correta ⟵ GABARITO
Como a alternativa está representada por uma imagem no enunciado original, deduzimos que a consulta correta segue o padrão:
SELECT vendedor
FROM vendas
GROUP BY vendedor
HAVING SUM(valor) = (SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS sub);
Essa estrutura utiliza uma subconsulta para calcular o maior total (MAX da soma) e depois filtra os grupos cuja soma seja igual a esse valor. Assim, todos os vendedores com o maior total são retornados, mesmo em caso de empate. É a única abordagem que satisfaz o objetivo.
Alternativa C — ❌ Incorreta
Não temos o texto exato, mas pela lógica da banca, provavelmente contém erro semântico ou sintático, como uso incorreto de HAVING sem GROUP BY ou tentativa de comparar diretamente com MAX(SUM(valor)).
Alternativa D — ❌ Incorreta
SELECT vendedor, MAX(SUM(valor))
FROM vendas
GROUP BY vendedor;
A expressão MAX(SUM(valor)) é inválida no SQL padrão e no MySQL. Não é permitido aninhar funções de agregação diretamente; qualquer agregação aninhada exige uma subconsulta. Além disso, a consulta retornaria uma linha por vendedor com a soma de cada um, e o MAX não teria efeito útil — na verdade, geraria um erro de sintaxe.
Alternativa E — ❌ Incorreta
Assim como a C, não temos o texto, mas a tendência é que contenha algum equívoco, como não agrupar corretamente ou usar LIMIT sem considerar empates.
PEGA ESSA DICA!
Quando o enunciado menciona “considerando que pode haver empate”, descarte automaticamente qualquer solução que use LIMIT 1 ou TOP 1. A forma correta é calcular o valor máximo das agregações em uma subconsulta e usar HAVING para filtrar. Memorize essa estrutura:
SELECT coluna_agrupada
FROM tabela
GROUP BY coluna_agrupada
HAVING funcao_agregacao(coluna) = (SELECT MAX(total) FROM (SELECT funcao_agregacao(coluna) AS total FROM tabela GROUP BY coluna_agrupada) AS alias);
Gabarito: letra B — a única consulta que respeita a possibilidade de empate e retorna exclusivamente o(s) vendedor(es) com o maior valor total de vendas.