Consulta SQL para o vendedor com maior total de vendas
Gabarito: letra B. A consulta correta agrupa as vendas por vendedor, calcula o total de cada um e, com a cláusula HAVING, filtra apenas os grupos cuja soma seja igual ao maior total obtido em uma subconsulta — assim, retorna todos os vendedores empatados no topo, atendendo ao requisito de considerar empates. As demais alternativas ou retornam apenas um vendedor (ignorando empates), ou usam sintaxe inválida, ou comparam valores individuais em vez de totais.
O problema central é: como obter o vendedor (ou vendedores) com o maior valor total de vendas, incluindo empates? A solução clássica em SQL é usar GROUP BY para agregar os totais por vendedor e, em seguida, uma subconsulta que calcule o máximo desses totais. A cláusula HAVING permite filtrar grupos após a agregação, comparando SUM(valor) de cada grupo com o máximo global. Essa abordagem é portátil e funciona em MySQL, PostgreSQL, SQL Server etc.
Vamos entender cada peça:
GROUP BY vendedor: agrupa as linhas da tabela por vendedor, permitindo que funções de agregação como SUM(valor) atuem sobre cada grupo.
SUM(valor): calcula o total de vendas de cada vendedor.
Subconsulta: SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS subtotais — primeiro calcula o total de cada vendedor (subconsulta interna), depois extrai o maior desses totais.
HAVING SUM(valor) = (subconsulta): filtra os grupos cuja soma seja exatamente igual ao maior total. Se houver empate, todos os vendedores com esse total aparecem.
Um exemplo concreto: suponha a tabela vendas com os registros:
vendedor | valor |
|---|
Ana | 100 |
Ana | 200 |
Bruno | 150 |
Bruno | 150 |
Carla | 300 |
Os totais por vendedor são: Ana = 300, Bruno = 300, Carla = 300. O maior total é 300. A consulta da alternativa B retornaria Ana, Bruno e Carla — todos empatados. Já a alternativa A, com ORDER BY SUM(valor) DESC LIMIT 1, retornaria apenas um deles (o primeiro na ordem de desempate, que não é especificada), violando o requisito de considerar empates.
A pegadinha da banca está em confundir "maior valor total" com "maior valor individual". A alternativa E, por exemplo, compara valor (cada venda) com o MAX(valor) da tabela, retornando vendedores que tenham uma venda individual máxima — não o maior total. A alternativa C usa >= ALL, que é sintaxe válida em alguns bancos, mas não no MySQL (que não suporta ALL com subconsulta dessa forma). A alternativa D tenta usar MAX(SUM(valor)), o que é inválido porque não se pode aninhar funções de agregação diretamente.
Guarde o critério decisivo: para considerar empates, a consulta deve comparar o total de cada grupo com o máximo dos totais — e isso se faz com HAVING + subconsulta, não com LIMIT 1.
Alternativa A — ❌ Incorreta
Esta consulta usa ORDER BY SUM(valor) DESC LIMIT 1, que retorna apenas um vendedor — o primeiro após a ordenação. Se houver empate, apenas um deles é retornado, ignorando os demais. O enunciado exige exclusivamente o nome do vendedor com o maior valor total, considerando que pode haver empate — ou seja, devem ser retornados todos os vendedores com o maior total. O LIMIT 1 quebra esse requisito.
Alternativa B — ✅ Correta ⟵ GABARITO
A consulta agrupa por vendedor, calcula o total de cada um e, com HAVING, filtra os grupos cuja soma seja igual ao maior total obtido na subconsulta. A subconsulta SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS subtotais calcula o maior total entre todos os vendedores. Assim, todos os vendedores com esse total são retornados, incluindo empates. A sintaxe é válida em MySQL e em outros SGBDs relacionais.
Alternativa C — ❌ Incorreta
A cláusula HAVING SUM(valor) >= ALL (SELECT SUM(valor) FROM vendas GROUP BY vendedor) é sintaticamente inválida no MySQL. O operador ALL não é suportado dessa forma no MySQL (diferente de ANY/SOME). Além disso, a lógica >= ALL seria equivalente a >= MAX, mas a sintaxe correta seria HAVING SUM(valor) >= (SELECT MAX(...)). Mesmo que fosse corrigida, a intenção de retornar todos os empatados seria atendida, mas a forma apresentada não funciona no MySQL.
Alternativa D — ❌ Incorreta
SELECT vendedor, MAX(SUM(valor)) FROM vendas GROUP BY vendedor é inválida porque não se pode aninhar funções de agregação (MAX(SUM(...))). O MySQL não permite essa sintaxe. Além disso, mesmo que fosse possível, retornaria o máximo da soma de cada grupo, o que não faz sentido — cada grupo já tem uma soma única.
Alternativa E — ❌ Incorreta
Esta consulta compara valor (valor de cada venda individual) com o MAX(valor) da tabela inteira, retornando vendedores que tenham uma venda individual igual ao maior valor de venda. Isso não considera o total de vendas por vendedor. Por exemplo, um vendedor com uma única venda de 1000 e outro com várias vendas somando 1500: a consulta retornaria o primeiro (por ter a venda individual máxima), mas o correto seria o segundo (maior total). Além disso, a cláusula GROUP BY vendedor sem função de agregação na lista de seleção é desnecessária e pode gerar erro em alguns bancos.
Gabarito: letra B — a única consulta que retorna todos os vendedores com o maior total de vendas, considerando empates.