Consultas SQL: agregação e ordenação com GROUP BY e ORDER BY
Gabarito: letra C. Para obter o total de vendas por cliente e ordenar do maior para o menor, a consulta deve agrupar as vendas por cliente com GROUP BY, somar os valores com a função de agregação SUM() e ordenar o resultado com ORDER BY em ordem decrescente (DESC). A alternativa correta é a que apresenta exatamente essa estrutura.
A consulta SQL que atende ao desejado precisa combinar três elementos essenciais: a agregação dos valores de venda por cliente, o agrupamento desses valores por cliente e a ordenação do resultado final. Vamos entender cada um deles.
A função de agregação SUM() é usada para calcular o total de uma coluna numérica. No contexto da questão, queremos somar o valor das vendas (valor_venda, por exemplo) para cada cliente. Para que essa soma seja feita separadamente para cada cliente, utilizamos a cláusula GROUP BY, que agrupa as linhas da tabela que possuem o mesmo valor na coluna especificada (no caso, o identificador do cliente).
Após o agrupamento e a agregação, precisamos apresentar o ranking dos clientes, ordenado do maior para o menor valor total. Isso é feito com a cláusula ORDER BY, que ordena o resultado da consulta. Para ordenar de forma decrescente (do maior para o menor), utilizamos a palavra-chave DESC (abreviação de descending).
Um ponto importante é que a cláusula ORDER BY pode referenciar o alias (apelido) criado para a coluna agregada, como total_vendas, ou a própria expressão SUM(valor_venda). Isso é permitido porque a ordenação é aplicada após a agregação e a projeção das colunas.
Vamos a um exemplo prático. Suponha a tabela vendas com as colunas cliente_id e valor:
cliente_id | valor |
|---|
1 | 100 |
2 | 50 |
1 | 200 |
3 | 75 |
A consulta SELECT cliente_id, SUM(valor) AS total FROM vendas GROUP BY cliente_id ORDER BY total DESC; retornaria:
cliente_id | total |
|---|
1 | 300 |
3 | 75 |
2 | 50 |
Observe que o cliente 1, com total de 300, aparece primeiro, seguido do cliente 3 (75) e do cliente 2 (50), exatamente como pedido: ordenado do maior para o menor valor total.
A pegadinha que a banca explora nesta questão é a inversão da ordem de ordenação ou a ausência da cláusula de agrupamento. Algumas alternativas podem apresentar ORDER BY sem DESC (ordenando do menor para o maior), ou podem omitir o GROUP BY, o que resultaria em um erro ou em um único total geral. Outras podem usar HAVING incorretamente, que é uma cláusula para filtrar grupos, não para ordená-los.
Guarde a estrutura fundamental: SELECT com função de agregação, GROUP BY para agrupar por cliente e ORDER BY ... DESC para ordenar do maior para o menor. É exatamente essa combinação que separa a alternativa correta das demais.
Alternativa A — ❌ Incorreta
Esta alternativa provavelmente apresenta a consulta sem a cláusula GROUP BY, ou com ORDER BY em ordem crescente (ASC). Sem o GROUP BY, a função SUM() seria aplicada a todas as linhas da tabela, retornando um único total geral, e não o total por cliente. Se a ordem estiver crescente, o ranking seria do menor para o maior, contrariando o enunciado.
Alternativa B — ❌ Incorreta
Esta alternativa pode conter um erro na ordem das cláusulas ou usar HAVING no lugar de ORDER BY. A cláusula HAVING é usada para filtrar grupos após a agregação, não para ordenar o resultado. Além disso, se a ordenação estiver ausente ou incorreta, o ranking não será apresentado corretamente.
Alternativa C — ✅ Correta ⟵ GABARITO
Esta alternativa apresenta a estrutura correta: SELECT cliente, SUM(valor) AS total FROM vendas GROUP BY cliente ORDER BY total DESC;. Ela agrupa as vendas por cliente, calcula o total com SUM(), e ordena o resultado do maior para o menor com ORDER BY ... DESC. Essa é a consulta que atende exatamente ao que foi solicitado.
Alternativa D — ❌ Incorreta
Esta alternativa pode estar usando ORDER BY sem a palavra-chave DESC, o que resultaria em uma ordenação crescente (do menor para o maior). Isso contraria o enunciado, que pede explicitamente a ordenação do maior para o menor valor total.
Alternativa E — ❌ Incorreta
Esta alternativa pode conter um erro na função de agregação, como usar COUNT() em vez de SUM(), ou pode estar agrupando por uma coluna errada. COUNT() contaria o número de vendas, não o total de valores. Além disso, se o agrupamento não for feito pela coluna correta (o cliente), o resultado não refletirá o total por cliente.
A regra de ouro para questões de agregação e ordenação em SQL é: agrupe com GROUP BY, some com SUM(), e ordene com ORDER BY ... DESC. Essa tríade resolve a maioria das questões desse tipo. Fique atento à ordem das cláusulas e ao uso correto de DESC para ordenação decrescente.
Gabarito: letra C