Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026
Banco de Dados›Consultas e Comandos em SQL
Código
fc142299
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Em uma SEFAZ, a tabela PAGAMENTO_ICMS possui valores pagos por contribuinte e exercício, e a necessidade de retornar apenas contribuintes cujo pagamento em um exercício seja maior que a média do próprio exercício, calculada dinamicamente. Nesse caso, a construção SQL que atende corretamente ao que se deseja é
Asubquery correlacionada no WHERE comparando o valor com a média do mesmo exercício.
Bsubquery escalar no SELECT que calcula a média, substituindo a necessidade de filtragem.
Csubquery no FROM que calcula média global e compara sem separar por exercício.
DAVG(...) OVER(...) aplicado diretamente na cláusula WHERE da mesma consulta.
EHAVING sem GROUP BY para restringir pagamentos acima da média do exercício.
Revelar gabarito e comentário▾
GabaritoA — subquery correlacionada no WHERE comparando o valor com a média do mesmo exercício.
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: subquery correlacionada para comparação com média por grupo
Gabarito: letra A. Para retornar apenas contribuintes cujo pagamento em um exercício seja maior que a média do próprio exercício, calculada dinamicamente, a construção correta é uma subquery correlacionada no WHERE, que compara o valor de cada linha com a média calculada para o mesmo exercício. Essa técnica permite que a média seja recalculada para cada linha, considerando apenas os registros do exercício correspondente, atendendo exatamente ao requisito de "média do próprio exercício".
O problema exige uma comparação entre o valor de cada pagamento e a média dos pagamentos do mesmo exercício. A média não é um valor fixo, mas sim um valor que depende do exercício de cada linha. Uma subquery correlacionada é a ferramenta ideal para isso, pois ela é executada uma vez para cada linha da consulta externa, usando valores da linha atual para filtrar os dados da subquery. No caso, a subquery calcularia a média dos pagamentos do exercício da linha atual, e a cláusula WHERE compararia o valor da linha com essa média.
A alternativa A descreve exatamente essa abordagem: uma subquery correlacionada no WHERE que compara o valor com a média do mesmo exercício. Essa é a construção SQL que atende corretamente ao que se deseja, pois permite o cálculo dinâmico da média por exercício e a filtragem das linhas que atendem à condição.
As demais alternativas apresentam abordagens incorretas ou incompletas. A alternativa B sugere uma subquery escalar no SELECT, que calcula a média, mas não realiza a filtragem necessária. A alternativa C propõe uma subquery no FROM que calcula a média global, sem separar por exercício, o que não atende ao requisito. A alternativa D sugere usar AVG(...) OVER(...) diretamente no WHERE, o que não é permitido na sintaxe SQL padrão. A alternativa E propõe usar HAVING sem GROUP BY, o que não é válido para filtrar linhas individuais.
A chave para resolver esta questão é entender a diferença entre uma subquery correlacionada e uma subquery não correlacionada. Uma subquery não correlacionada é executada uma única vez e retorna um valor fixo, enquanto uma subquery correlacionada é executada para cada linha da consulta externa, usando valores da linha atual. No caso, a média do exercício varia para cada linha, então é necessário usar uma subquery correlacionada.
1Para cada linha externa
2Calcula média do exercício
3Compara valor com a média
4Retorna se maior
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A subquery correlacionada no WHERE é a construção correta. Ela permite que, para cada linha da tabela PAGAMENTO_ICMS, seja calculada a média dos pagamentos do mesmo exercício, e a linha seja retornada apenas se o seu valor for maior que essa média. Isso atende exatamente ao requisito de "média do próprio exercício, calculada dinamicamente".
Alternativa B — ❌ Incorreta
Uma subquery escalar no SELECT calcula a média, mas não realiza a filtragem. Ela apenas adicionaria uma coluna com a média ao resultado, mas não eliminaria as linhas que não atendem à condição. Para filtrar, seria necessário usar a subquery no WHERE, não no SELECT.
Alternativa C — ❌ Incorreta
Uma subquery no FROM que calcula a média global não separa por exercício. Isso faria com que todos os contribuintes fossem comparados com a média geral, e não com a média do próprio exercício, o que não atende ao requisito.
Alternativa D — ❌ Incorreta
A função de janela AVG(...) OVER(...) não pode ser usada diretamente na cláusula WHERE. As funções de janela são avaliadas após a cláusula WHERE, então não é possível usá-las para filtrar linhas na mesma consulta. Seria necessário usar uma subquery ou uma CTE para calcular a média e depois filtrar.
Alternativa E — ❌ Incorreta
A cláusula HAVING é usada para filtrar grupos, não linhas individuais. Além disso, HAVING sem GROUP BY não é uma construção válida na maioria dos bancos de dados. Para filtrar linhas com base em uma média calculada por grupo, seria necessário usar uma subquery correlacionada ou uma junção com uma subquery que calcula as médias.