Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026
Banco de Dados›Consultas e Comandos em SQL
Código
fc142294
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Deseja-se obter a apuração do total de ICMS por município e, a partir desse resultado intermediário, retornar apenas municípios cujo total esteja acima da média estadual, usando SQL Oracle com legibilidade e reúso do resultado agregado. Para isso, a estrutura adequada deve usar
ACommon Table Expression (WITH) para total por município e, na consulta final, filtrar por comparação com a média.
BSUM e AVG na mesma lista SELECT sem separar níveis de agregação.
CHAVING com subconsulta que referencia a própria consulta agregada sem CTE.
Dsubconsulta correlacionada no SELECT para recalcular o total de cada município em cada linha.
EGROUP BY e aplicar WHERE comparando diretamente com AVG(total) no mesmo nível.
Revelar gabarito e comentário▾
GabaritoA — Common Table Expression (WITH) para total por município e, na consulta final, filtrar por comparação com a média.
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”.
Common Table Expressions (CTE) no Oracle: reúso de resultado agregado
Gabarito: letra A. A estrutura adequada é a Common Table Expression (WITH), pois ela permite calcular o total de ICMS por município em um bloco nomeado e, na consulta principal, reutilizar esse resultado para filtrar os municípios cujo total supera a média estadual — exatamente o que o enunciado pede: legibilidade e reúso do resultado agregado.
O problema central é comparar um valor agregado por grupo (total por município) com um valor agregado global (média estadual). Em SQL, não é possível usar diretamente uma função de agregação dentro da cláusula WHERE, pois o WHERE é avaliado linha a linha, antes do agrupamento. A solução clássica é criar um resultado intermediário com o total por município e, em seguida, comparar esse total com a média calculada sobre todos os totais.
A CTE (Common Table Expression) é um recurso do SQL padrão (e do Oracle) que permite definir um conjunto de resultados nomeado, que pode ser referenciado na consulta principal. Ela é ideal para esse cenário porque:
Legibilidade: separa a lógica de agregação (total por município) da lógica de filtro (comparação com a média), tornando a consulta mais clara.
Reúso: o resultado intermediário pode ser usado múltiplas vezes na consulta principal, evitando repetição de subconsultas.
Um exemplo prático seria:
WITH total_municipio AS (
SELECT municipio, SUM(valor_icms) AS total
FROM notas_fiscais
GROUP BY municipio
)
SELECT municipio, total
FROM total_municipio
WHERE total > (SELECT AVG(total) FROM total_municipio);
Nessa consulta, a CTE total_municipio calcula o total por município. Na consulta principal, filtramos os municípios cujo total é maior que a média dos totais, calculada por uma subconsulta que referencia a própria CTE. Isso é possível porque a CTE é materializada (em termos lógicos) antes da consulta principal.
A alternativa correta é a letra A, pois descreve exatamente essa abordagem: usar uma CTE para o total por município e, na consulta final, filtrar por comparação com a média.
1WITH total_municipio
2SUM por município (GROUP BY)
3Comparar com AVG(total)
4Filtrar WHERE total > média
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa descreve precisamente a solução com CTE: primeiro, calcula-se o total por município em uma Common Table Expression (WITH); depois, na consulta final, filtra-se os municípios cujo total é maior que a média estadual. Isso atende aos requisitos de legibilidade e reúso do resultado agregado, pois a CTE pode ser referenciada tanto na consulta principal quanto na subconsulta que calcula a média.
Alternativa B — ❌ Incorreta
Colocar SUM e AVG na mesma lista SELECT sem separar níveis de agregação é inválido. Se você escrever SELECT municipio, SUM(valor), AVG(valor) FROM tabela GROUP BY municipio, o AVG(valor) calculará a média por município, não a média estadual. Para obter a média estadual, seria necessário um segundo nível de agregação, o que não é possível na mesma lista SELECT sem uma subconsulta ou CTE.
Alternativa C — ❌ Incorreta
Usar HAVING com uma subconsulta que referencia a própria consulta agregada sem CTE não é possível. O HAVING é avaliado após o agrupamento, mas uma subconsulta dentro dele não pode referenciar diretamente o resultado agregado da consulta externa sem uma CTE ou subconsulta derivada. A sintaxe correta exigiria uma subconsulta na cláusula FROM ou uma CTE.
Alternativa D — ❌ Incorreta
Uma subconsulta correlacionada no SELECT para recalcular o total de cada município em cada linha seria extremamente ineficiente e desnecessariamente complexa. Além disso, ela não resolveria o problema de comparar com a média estadual, pois a média também precisaria ser calculada. A CTE é a abordagem mais limpa e eficiente.
Alternativa E — ❌ Incorreta
Aplicar GROUP BY e usar WHERE comparando diretamente com AVG(total) no mesmo nível é inválido. O WHERE é avaliado antes do agrupamento, portanto não pode referenciar funções de agregação como AVG(total). Além disso, total não é uma coluna da tabela original, mas um alias criado no SELECT, que não pode ser usado no WHERE.