Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
fc150360
Banca
FCC
Órgão
SEFAZ PI
Ano
2025
Cargo
AFFE ( )

Suponha que uma Receita Federal está implementando um sistema para gerenciar a arrecadação de tributos como Imposto sobre a Renda das Pessoas Jurídicas (IRPJ) e Contribuição Social sobre o Lucro Líquido (CSLL). O banco de dados, aberto e em condições ideais, possui as seguintes tabelas:

 

tbl_contribuintes: Campos: id_contribuinte (PK), cnpj, razao_social.

tbl_tributos: Campos: id_tributo (PK), id_contribuinte (FK referenciando tbl_contribuintes),

tipo_tributo, valor, data_vencimento.

 

Uma Auditora Fiscal da Receita precisa da lista com o total de valores devidos por tipo de tributo, apenas para tributos com vencimento após 01/01/2025, ordenados pelo valor total em ordem decrescente. O comando SQL correto, considerando boas práticas de nomeação e integridade referencial, é

  1. ASELECT t1.tipo_tributo, SUM(t1.valor) FROM tbl_tributos t1, tbl_contribuintes t2 WHERE t1.id_contribuinte = t2.id_contribuinte AND t2.data_vencimento > '2025-01-01' GROUP BY t1.tipo_tributo ORDER BY 2 DESC;
  2. BSELECT tipo_tributo, SUM(valor) AS total_valor FROM tbl_tributos WHERE data_vencimento > '2025-01-01' GROUP BY tipo_tributo ORDER BY total_valor DESC;
  3. CSELECT tipo_tributo, SUM(valor) FROM tributos WHERE vencimento > '2025-01-01' GROUP BY tipo_tributo ORDER BY 2;
  4. DSELECT tipo, SUM(val) AS total FROM tbl_tributos WHERE data_vencimento > '2025-01-01' ORDER BY total;
  5. ESELECT tipo_tributo, AVG(valor) AS total_valor FROM tbl_tributos WHERE data_vencimento > '2025-01-01' GROUP BY tipo_tributo ORDER BY total_valor DESC;
Revelar gabarito e comentário

GabaritoB — SELECT tipo_tributo, SUM(valor) AS total_valor FROM tbl_tributos WHERE data_vencimento > '2025-01-01' GROUP BY tipo_tributo ORDER BY total_valor 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”.

Consultas SQL: agrupamento com GROUP BY e funções de agregação

Gabarito: letra B. A consulta correta seleciona tipo_tributo e a soma de valor da tabela tbl_tributos, filtra os registros com data_vencimento > '2025-01-01' no WHERE, agrupa por tipo_tributo e ordena pelo total em ordem decrescente com ORDER BY total_valor DESC. A alternativa B é a única que combina todos esses elementos corretamente, usando alias para a coluna agregada e referenciando-a na ordenação.

A questão exige a construção de uma consulta SQL que atenda a quatro requisitos: (1) somar os valores por tipo de tributo, (2) filtrar apenas tributos com vencimento após 01/01/2025, (3) agrupar os resultados por tipo de tributo e (4) ordenar pelo total em ordem decrescente. Vamos analisar cada componente da solução.

Função de agregação SUM: Para somar os valores, usamos SUM(valor). Essa função agrega os valores de uma coluna em um único resultado. Quando combinada com GROUP BY, ela calcula a soma para cada grupo distinto da coluna especificada. No caso, GROUP BY tipo_tributo cria um grupo para cada tipo de tributo (IRPJ, CSLL, etc.) e SUM(valor) calcula o total devido para cada um.

Filtro com WHERE: A condição data_vencimento > '2025-01-01' filtra as linhas antes do agrupamento. É importante notar que o filtro é aplicado na tabela tbl_tributos, que contém a coluna data_vencimento. Não é necessário fazer um JOIN com tbl_contribuintes, pois a consulta não precisa de informações dessa tabela — o requisito é apenas sobre tributos e seus vencimentos.

Ordenação com ORDER BY: Para ordenar pelo total em ordem decrescente, usamos ORDER BY total_valor DESC. A alternativa B usa um alias AS total_valor para a coluna agregada, o que permite referenciá-la diretamente na ordenação. Isso é uma boa prática, pois torna a consulta mais legível e evita ambiguidades.

Por que as outras alternativas falham: A alternativa A faz um JOIN desnecessário com tbl_contribuintes e usa ORDER BY 2, que é uma referência posicional (menos legível). A alternativa C usa nomes de tabela e coluna incorretos (tributos em vez de tbl_tributos, vencimento em vez de data_vencimento). A alternativa D não usa GROUP BY, então SUM(valor) retornaria um único total, e a ordenação por total não faria sentido. A alternativa E usa AVG(valor) em vez de SUM(valor), calculando a média em vez do total.

A pegadinha central é a combinação de GROUP BY com a função de agregação correta e a ordenação pelo alias. Muitos candidatos confundem SUM com AVG, ou esquecem o GROUP BY, ou usam ORDER BY com a posição da coluna em vez do alias. A alternativa B resolve tudo de forma clara e correta.

  1. 1FROM
  2. 2WHERE
  3. 3GROUP BY
  4. 4SELECT
  5. 5ORDER BY
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Esta alternativa faz um JOIN desnecessário entre tbl_tributos e tbl_contribuintes. A consulta não precisa de dados da tabela de contribuintes, pois o filtro e o agrupamento são feitos apenas em tbl_tributos. Além disso, usa ORDER BY 2, que é uma referência posicional à segunda coluna do SELECT — funciona, mas é menos legível e não é considerada boa prática quando se pode usar um alias. O JOIN também pode gerar duplicação de linhas se houver múltiplos registros na tabela de contribuintes para o mesmo id_contribuinte, o que distorceria a soma.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta é a consulta correta. Ela seleciona tipo_tributo e SUM(valor) com alias total_valor da tabela tbl_tributos, filtra com WHERE data_vencimento > '2025-01-01', agrupa por tipo_tributo e ordena por total_valor DESC. A ordem de execução é: FROMWHEREGROUP BYSELECTORDER BY. O filtro é aplicado antes do agrupamento, garantindo que apenas tributos com vencimento após a data sejam considerados na soma. O alias total_valor é definido no SELECT e pode ser usado no ORDER BY, pois a ordenação é a última etapa.

Alternativa C — ❌ Incorreta

Esta alternativa usa nomes incorretos de tabela e coluna: tributos em vez de tbl_tributos e vencimento em vez de data_vencimento. Além disso, o ORDER BY 2 é uma referência posicional, que funciona, mas não é a melhor prática. A consulta também não usa alias para a coluna agregada, o que dificulta a legibilidade. O erro principal é a referência a colunas que não existem no esquema fornecido.

Alternativa D — ❌ Incorreta

Esta alternativa usa nomes de colunas incorretos (tipo em vez de tipo_tributo, val em vez de valor) e não usa GROUP BY. Sem GROUP BY, a função SUM(val) retornaria um único total para todas as linhas que atendem ao filtro, não um total por tipo de tributo. Além disso, o ORDER BY total não faz sentido, pois total é o alias da soma, mas sem agrupamento não há múltiplas linhas para ordenar.

Alternativa E — ❌ Incorreta

Esta alternativa usa AVG(valor) em vez de SUM(valor). A função AVG calcula a média dos valores, não o total. O requisito é "total de valores devidos por tipo de tributo", que exige SUM. O restante da consulta (filtro, agrupamento e ordenação) está correto, mas a função de agregação errada invalida a alternativa.

NÃO CAIA NESSA!

A banca explora a confusão entre SUM e AVG — a alternativa E usa AVG(valor) com alias total_valor, o que parece plausível, mas calcula a média, não o total. Outra armadilha é a referência posicional ORDER BY 2 nas alternativas A e C, que funciona, mas é considerada má prática quando se pode usar um alias. Fique atento: a questão pede "total", então a função deve ser SUM, e a ordenação deve usar o alias definido no SELECT.

PEGA ESSA DICA!

Para questões de SQL com agregação, siga esta ordem mental: (1) identifique a função de agregação correta (SUM, AVG, COUNT, MIN, MAX); (2) verifique se o GROUP BY está presente quando há agregação com colunas não agregadas no SELECT; (3) confira se o filtro está no WHERE (antes do agrupamento) e não no HAVING (depois do agrupamento); (4) use alias para colunas agregadas e referencie-o no ORDER BY. Essa sequência elimina a maioria dos erros.

Gabarito: letra B

Link permanente: /questoes/fc150360