Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fc150358
Banca
FCC
Órgão
SEFAZ PI
Ano
2025
Cargo
ATE ( )
Uma consultoria tributária mantém um banco de dados com a tabela impostos, que registra os valores de impostos pagos por empresas. A estrutura da tabela é apresentada a seguir: id_empresa (INT) : Identificador único da empresa nome_empresa (VARCHAR) : Nome da empresa valor_imposto (DECIMAL) : Valor do imposto pago data_pagamento (DATE) : Data do pagamento (formato padrão ISO (YYYY-MM-DD)) categoria (VARCHAR) : Categoria do imposto (exemplo: "ICMS", "ISS", "IPI") O contador precisa de um relatório que mostre o total de impostos pagos por categoria em 2024, ordenado pelo valor total de forma decrescente. Considerando que o banco de dados está aberto e em condições ideais, o comando SQL que atende a necessidade do contador é:
ASELECT categoria, COUNT(valor_imposto) FROM impostos WHERE YEAR(data_pagamento) = 2024 GROUP BY categoria ORDER BY COUNT(valor_imposto) DESC;
BSELECT categoria, AVG(valor_imposto) FROM impostos WHERE data_pagamento LIKE '2024%' GROUP BY categoria ORDER BY AVG(valor_imposto) DESC;
CSELECT categoria, SUM(valor_imposto) FROM impostos WHERE YEAR(data_pagamento) = 2024 ORDER BY valor_imposto DESC;
DSELECT categoria, SUM(valor_imposto) FROM impostos WHERE data_pagamento = '2024' GROUP BY categoria ORDER BY SUM(valor_imposto) DESC;
ESELECT categoria, SUM(valor_imposto) FROM impostos WHERE data_pagamento LIKE '2024%' GROUP BY categoria ORDER BY SUM(valor_imposto) DESC;
Revelar gabarito e comentário▾
GabaritoE — SELECT categoria, SUM(valor_imposto) FROM impostos WHERE data_pagamento LIKE '2024%' GROUP
BY categoria ORDER BY SUM(valor_imposto) 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: agrupamento, funções de agregação e filtro por data
Gabarito: letra E. O comando correto usa SUM(valor_imposto) para somar os valores, WHERE data_pagamento LIKE '2024%' para filtrar o ano de 2024, GROUP BY categoria para agrupar por categoria e ORDER BY SUM(valor_imposto) DESC para ordenar do maior para o menor total. A alternativa E é a única que combina todos esses elementos corretamente.
A questão cobra o domínio de três cláusulas fundamentais do SQL que, juntas, resolvem o problema: WHERE, GROUP BY e ORDER BY, além da função de agregação SUM. Vamos entender cada uma delas e por que a alternativa E é a única que atende plenamente ao pedido do contador.
1. O que é uma função de agregação?
Funções de agregação são funções que operam sobre um conjunto de linhas e retornam um único valor resumido. As principais são:
SUM(coluna): calcula a soma dos valores de uma coluna numérica.
COUNT(coluna): conta o número de linhas (ou valores não nulos) de uma coluna.
AVG(coluna): calcula a média aritmética dos valores de uma coluna numérica.
MIN(coluna) e MAX(coluna): retornam o menor e o maior valor, respectivamente.
No problema, o contador precisa do total de impostos pagos, ou seja, da soma dos valores. Isso elimina de imediato as alternativas que usam COUNT (A) e AVG (B), pois elas não calculam o total, mas sim a quantidade de registros e a média, respectivamente.
2. A cláusula WHERE e o filtro por data
A cláusula WHERE filtra as linhas da tabela antes do agrupamento. Para selecionar apenas os pagamentos de 2024, precisamos de uma condição que verifique o ano da data_pagamento. Como a coluna é do tipo DATE no formato ISO (YYYY-MM-DD), podemos usar:
WHERE YEAR(data_pagamento) = 2024: usa a função YEAR para extrair o ano da data e compará-lo com 2024. Essa é uma forma válida e portável.
WHERE data_pagamento LIKE '2024%': usa o operador LIKE com o curinga % para encontrar strings que começam com '2024'. Como a data está no formato ISO, isso equivale a filtrar todos os registros cujo ano é 2024. Essa também é uma forma válida.
A alternativa D usa WHERE data_pagamento = '2024', o que está incorreto, pois compara a data inteira com a string '2024', o que nunca será verdadeiro (a data completa nunca é igual a apenas '2024').
3. A cláusula GROUP BY e a ordenação
A cláusula GROUP BY agrupa as linhas que têm os mesmos valores nas colunas especificadas. No nosso caso, GROUP BY categoria agrupa todos os pagamentos de cada categoria (ICMS, ISS, IPI, etc.) em um único grupo. As funções de agregação são então aplicadas a cada grupo separadamente.
A cláusula ORDER BY ordena o resultado final. Para ordenar pelo total de forma decrescente, usamos ORDER BY SUM(valor_imposto) DESC. A palavra-chave DESC indica ordem decrescente (do maior para o menor).
A alternativa C usa ORDER BY valor_imposto DESC, o que está incorreto, pois tenta ordenar pelo valor individual de cada linha, não pelo total agrupado. Além disso, ela não possui GROUP BY, o que faz com que a consulta nem seja executada corretamente (em bancos de dados com ONLY_FULL_GROUP_BY habilitado, como o MySQL, isso geraria um erro).
4. A ordem lógica de execução do SQL
É importante entender a ordem lógica de execução de uma consulta SQL, que é diferente da ordem em que as cláusulas são escritas:
FROM: define a tabela de origem.
WHERE: filtra as linhas.
GROUP BY: agrupa as linhas filtradas.
HAVING: filtra os grupos (não usado aqui).
SELECT: seleciona as colunas e aplica as funções de agregação.
ORDER BY: ordena o resultado final.
Essa ordem explica por que o WHERE vem antes do GROUP BY e por que o ORDER BY pode usar a função de agregação SUM diretamente.
5. A pegadinha da banca
A banca explora a confusão entre as funções de agregação (COUNT, AVG, SUM) e entre as formas de filtrar por data. O candidato que não domina esses conceitos pode cair na alternativa A (que usa COUNT em vez de SUM) ou na alternativa D (que compara a data inteira com '2024').
Agora, vamos analisar cada alternativa em detalhes.
1Identificar função de agregação
2Verificar filtro de data
3Conferir GROUP BY
4Conferir ORDER BY
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
O erro está no uso de COUNT(valor_imposto). O contador precisa do total (soma) dos valores, não da quantidade de pagamentos. COUNT conta o número de linhas (ou valores não nulos), enquanto SUM soma os valores. Além disso, a ordenação por COUNT(valor_imposto) DESC ordenaria pela quantidade de pagamentos, não pelo valor total.
Alternativa B — ❌ Incorreta
O erro está no uso de AVG(valor_imposto). O contador precisa do total (soma), não da média dos valores. AVG calcula a média aritmética, o que não atende à necessidade do relatório. A ordenação por AVG(valor_imposto) DESC também estaria errada, pois ordenaria pela média, não pelo total.
Alternativa C — ❌ Incorreta
Esta alternativa tem dois erros graves:
Falta a cláusula GROUP BY categoria: sem ela, a consulta não agrupa os dados por categoria, e a função SUM(valor_imposto) seria aplicada a todas as linhas de uma vez, retornando um único total geral, não um total por categoria.
ORDER BY valor_imposto DESC: tenta ordenar pelo valor individual de cada linha, não pelo total agrupado. O correto seria ORDER BY SUM(valor_imposto) DESC.
Além disso, em bancos de dados com ONLY_FULL_GROUP_BY habilitado, essa consulta nem executaria, pois a coluna categoria não está no GROUP BY nem em uma função de agregação.
Alternativa D — ❌ Incorreta
O erro está na condição WHERE data_pagamento = '2024'. A coluna data_pagamento é do tipo DATE e armazena a data completa (ano, mês e dia). Compará-la com a string '2024' nunca será verdadeiro, pois a data completa nunca é igual a apenas '2024'. O correto seria usar YEAR(data_pagamento) = 2024 ou data_pagamento LIKE '2024%'.
Alternativa E — ✅ Correta ⟵ GABARITO
Esta alternativa está correta porque:
SUM(valor_imposto): calcula o total de impostos pagos, atendendo à necessidade do contador.
WHERE data_pagamento LIKE '2024%': filtra corretamente os pagamentos de 2024, pois a data está no formato ISO (YYYY-MM-DD) e o curinga % casa com qualquer sequência de caracteres após '2024'.
GROUP BY categoria: agrupa os pagamentos por categoria, permitindo que o SUM seja calculado para cada uma.
ORDER BY SUM(valor_imposto) DESC: ordena o resultado pelo total de impostos, do maior para o menor, exatamente como pedido.
A ordem lógica de execução é: primeiro o WHERE filtra as linhas de 2024, depois o GROUP BY agrupa por categoria, o SUM calcula o total de cada grupo, e o ORDER BY ordena o resultado final.
NÃO CAIA NESSA!
A banca adora trocar as funções de agregação para confundir. Nesta questão, ela usa COUNT (alternativa A) e AVG (alternativa B) para testar se você sabe que o total pedido exige SUM. Além disso, a alternativa D testa se você sabe filtrar por ano em uma coluna DATE: comparar a data inteira com '2024' nunca funciona — é preciso usar YEAR() ou LIKE '2024%'. Com treino, você enxerga essas trocas de longe 💪
PEGA ESSA DICA!
Para questões de SQL que pedem um relatório com total, média ou contagem agrupada, siga este roteiro:
Identifique a função de agregação: total → SUM, média → AVG, contagem → COUNT.
Verifique o filtro: se a coluna é DATE, use YEAR(coluna) = valor ou coluna LIKE 'ano%' (para formato ISO).
Confira o GROUP BY: deve conter a coluna que aparece no SELECT sem função de agregação.
Confira o ORDER BY: deve usar a mesma função de agregação do SELECT para ordenar pelo resultado agregado.