Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026

Banco de DadosConsultas 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
  1. ACommon Table Expression (WITH) para total por município e, na consulta final, filtrar por comparação com a média.
  2. BSUM e AVG na mesma lista SELECT sem separar níveis de agregação.
  3. CHAVING com subconsulta que referencia a própria consulta agregada sem CTE.
  4. Dsubconsulta correlacionada no SELECT para recalcular o total de cada município em cada linha.
  5. 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.

  1. 1WITH total_municipio
  2. 2SUM por município (GROUP BY)
  3. 3Comparar com AVG(total)
  4. 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.

Gabarito: letra A

Link permanente: /questoes/fc142294