Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2026
Banco de Dados›SQL
Código
ce227873
Banca
CESPE / CEBRASPE
Órgão
SEFAZ-PR
Ano
2026
Nível
Médio
Cargo
Agente Fazendário Estadual - Função: Profissional de Tecnologia da Informação
As tabelas contribuinte e pagamento apresentadas anteriormente fazem parte do banco de dados da secretaria de fazenda de certo ente federativo. A administração tributária deste ente deseja listar os nomes dos contribuintes cujo valor total de pagamentos é superior à média total dos pagamentos de todos os contribuintes.A partir dessa situação hipotética, assinale a opção em que é corretamente apresentada a instrução adequada, de acordo com o padrão SQL/ANSI, para se obter a lista desejada pela administração tributária.
A
B
C
D
E
Revelar gabarito e comentário▾
GabaritoB — [imagem]
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”.
Consultas SQL com subconsulta e funções de agregação
Gabarito: letra B. Para listar os contribuintes cujo total de pagamentos supera a média geral, a instrução correta combina GROUP BY com a função de agregação SUM e uma subconsulta escalar que calcula a média total — a alternativa B é a única que aplica essa estrutura de forma sintaticamente válida no padrão SQL/ANSI.
O problema pede uma consulta que compare o valor agregado de cada grupo (cada contribuinte) com um valor global (a média de todos os pagamentos). Isso exige duas operações distintas: primeiro, agrupar os pagamentos por contribuinte e somar os valores de cada um; depois, comparar cada soma com a média geral calculada sobre todos os registros. A função AVG calcula a média de uma coluna, e SUM totaliza os valores de um grupo. A subconsulta (SELECT AVG(valor) FROM pagamento) retorna um único valor escalar — a média de todos os pagamentos — que pode ser usado diretamente na comparação do HAVING.
A cláusula HAVING é o ponto central: ela filtra grupos após a agregação, diferentemente do WHERE, que filtra linhas antes da agregação. Como a condição envolve o resultado de SUM(valor) — um valor que só existe depois do agrupamento —, o filtro precisa estar no HAVING. A subconsulta escalar no HAVING é avaliada uma única vez e comparada com cada total de grupo, o que atende exatamente ao requisito do enunciado.
Um exemplo concreto: se a tabela pagamento tem os registros (contribuinte A, R$ 100), (A, R$ 200), (B, R$ 50), a média geral é (100+200+50)/3 = R$ 116,67. O total de A é R$ 300, que supera a média; o total de B é R$ 50, que não supera. A consulta correta retornaria apenas o nome de A. A pegadinha clássica da banca é colocar a condição de agregação no WHERE (que não enxerga totais de grupo) ou usar AVG no lugar de SUM para o total individual.
Guarde a fronteira entre WHERE e HAVING: o primeiro filtra linhas antes do agrupamento; o segundo filtra grupos depois da agregação. É exatamente nessa distinção que as alternativas se dividem.
1GROUP BY contribuinte
2SUM(valor) por grupo
3HAVING compara com AVG geral
4Retorna nomes que superam
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Esta alternativa usa WHERE para filtrar o resultado da agregação SUM(valor). O WHERE é avaliado antes do GROUP BY, quando os totais por contribuinte ainda não foram calculados — a condição SUM(valor) > (SELECT AVG(valor) FROM pagamento) não pode ser avaliada nesse momento, pois SUM é uma função de agregação que só existe após o agrupamento. O correto seria usar HAVING.
Alternativa B — ✅ Correta ⟵ GABARITO
Esta alternativa aplica a estrutura correta: GROUP BY para agrupar por contribuinte, SUM(valor) para calcular o total de cada grupo, e HAVING para filtrar os grupos cujo total supera a média geral, obtida por uma subconsulta escalar (SELECT AVG(valor) FROM pagamento). A ordem das cláusulas segue o padrão SQL/ANSI: SELECT → FROM → GROUP BY → HAVING.
Alternativa C — ❌ Incorreta
Esta alternativa usa AVG(valor) no lugar de SUM(valor) para calcular o total por contribuinte. Isso retornaria a média dos pagamentos de cada contribuinte, não o total — o que não atende ao requisito de "valor total de pagamentos". Além disso, se a condição estiver no WHERE, o erro de usar WHERE com agregação também se aplica.
Alternativa D — ❌ Incorreta
Esta alternativa provavelmente usa WHERE com a condição de agregação, o que é inválido, ou omite o GROUP BY necessário para agregar por contribuinte. Sem o GROUP BY, a consulta trataria todos os registros como um único grupo, e a condição não faria sentido para listar contribuintes individuais.
Alternativa E — ❌ Incorreta
Esta alternativa provavelmente usa HAVING sem GROUP BY, o que é inválido no padrão SQL — HAVING só pode ser usado em conjunto com GROUP BY. Sem o agrupamento, não há grupos para filtrar, e a consulta não retornaria a lista de contribuintes.
NÃO CAIA NESSA!
Na prova, identifique o padrão: quando a condição envolve uma função de agregação (SUM, AVG, COUNT), o filtro vai no HAVING, nunca no WHERE. E lembre-se: SUM totaliza, AVG calcula a média — a banca adora trocar esses dois.