Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165264
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )
ATENÇÃO: use a tabela relacional IPCA a seguir para responder à próxima questão.
Tabela IPCA
indice
ano
mês
0,56
2023
12
0,28
2023
11
0,24
2023
10
. . .
. . .
. . .
0,2
2003
7
-0,15
2003
6
. . .
. . .
. . .
2,25
2003
1
2,1
2002
12
3,02
2002
11
. . .
. . .
. . .
0,57
2001
1
A instância da tabela contém os valores do índice IPCA para todos os meses dos anos de 2001 até 2023. Os valores pontilhados representam a continuidade mensal da série. Todas as colunas são numéricas e não aceitam valores nulos.
Assinale o comando SQL que produz as colunas ano, mes e indice, da tabela IPCA apresentada, ordenadas por ano/mês e precedidas por uma coluna com a numeração sequencial das linhas a partir de 1.
Aselect 12*(ano-min(ano)) + mes ordem,* from ipca order by ano, mes
Bselect 12 x (ano-(select min(ano) from ipca)) + mes ordem from ipca order by ano, mes
Cselect 12*(ano-(select min(ano))) + mes ordem,* from ipca order by ano, mes
Dselect 12*(ano-min(ano) + mes ordem,* from ipca order by 1,2
Eselect 12*(ano-(select min(ano) from ipca)) + mes ordem,* from ipca i order by ano, mes
Revelar gabarito e comentário▾
GabaritoE — select
12*(ano-(select min(ano) from ipca)) + mes ordem,*
from ipca i
order by ano, mes
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”.
Numeração sequencial de linhas em SQL
Gabarito: letra E. O comando correto é select 12*(ano-(select min(ano) from ipca)) + mes ordem,* from ipca i order by ano, mes — ele calcula uma coluna ordem que numera as linhas sequencialmente a partir de 1, usando uma subconsulta para obter o menor ano da tabela, e ordena por ano, mes. As demais alternativas falham por erros de sintaxe, por usar min(ano) sem subconsulta (o que geraria erro de agregação) ou por parênteses mal posicionados.
A questão pede que você produza uma coluna com numeração sequencial das linhas, começando em 1, ordenadas por ano e mês. A tabela IPCA contém dados mensais de 2001 a 2023, ou seja, 23 anos × 12 meses = 276 linhas. A numeração deve seguir exatamente essa ordem cronológica.
O truque está em como gerar essa numeração sem usar uma função de janela (como ROW_NUMBER()), que seria a solução mais natural. A banca quer que você use uma expressão aritmética que transforme a combinação (ano, mês) em um número sequencial. A fórmula é:
Vamos entender por que essa fórmula funciona. Se o ano mínimo é 2001, então para janeiro de 2001 (mês 1), temos: . Para dezembro de 2001 (mês 12): . Para janeiro de 2002: . E assim por diante, até dezembro de 2023: . A fórmula gera uma numeração contínua de 1 a 276, exatamente na ordem cronológica.
O ponto crítico é como obter o ano mínimo. Você não pode simplesmente escrever min(ano) na expressão, porque isso seria uma função de agregação sem GROUP BY, o que geraria um erro em quase todos os bancos de dados (a menos que a tabela inteira fosse agregada em uma única linha). A solução correta é usar uma subconsulta que retorne o menor ano: (select min(ano) from ipca). Essa subconsulta é avaliada uma única vez e retorna o valor escalar 2001, que é então usado na expressão aritmética para cada linha.
Agora, vamos analisar cada alternativa em detalhe, observando os erros de sintaxe e de lógica.
Alternativa A — ❌ Incorreta
A expressão 12*(ano-min(ano)) + mes usa min(ano)sem subconsulta. Isso é uma função de agregação aplicada diretamente na projeção, sem GROUP BY. Em SQL padrão, isso é inválido: você não pode misturar colunas normais (ano, mes) com uma função de agregação (min(ano)) sem agrupar. O banco retornaria um erro do tipo "column \"ipca.ano\" must appear in the GROUP BY clause or be used in an aggregate function". Além disso, a sintaxe ordem,* é inválida — não se pode misturar um alias com * dessa forma; o correto seria *, 12*(...) as ordem ou listar as colunas explicitamente.
Alternativa B — ❌ Incorreta
Aqui a subconsulta está correta: (select min(ano) from ipca). Porém, a sintaxe 12 x (ano-(select min(ano) from ipca)) + mes ordem usa a letra x em vez do operador de multiplicação *. Em SQL, x não é um operador válido — a multiplicação é feita com *. Além disso, falta a vírgula entre a expressão e o * (ou a listagem das colunas). O comando select 12 x (...) + mes ordem,* é sintaticamente inválido.
Alternativa C — ❌ Incorreta
A subconsulta está incompleta: (select min(ano)) — falta a cláusula from ipca. Sem ela, a subconsulta não sabe de qual tabela extrair o mínimo, gerando erro de sintaxe. Além disso, repete o mesmo problema da alternativa A: ordem,* é inválido.
Alternativa D — ❌ Incorreta
A expressão 12*(ano-min(ano) + mes tem um erro de parênteses: abre um parêntese em 12*( e nunca o fecha. O correto seria 12*(ano-min(ano)) + mes. Além disso, repete o erro de min(ano) sem subconsulta (mesmo problema da alternativa A). A ordenação order by 1,2 é válida (ordena pelas duas primeiras colunas do resultado), mas a expressão em si está errada.
Alternativa E — ✅ Correta ⟵ GABARITO
Esta alternativa está correta por três motivos:
Subconsulta correta: (select min(ano) from ipca) retorna o menor ano da tabela (2001), permitindo o cálculo da numeração.
Sintaxe válida: 12*(ano-(select min(ano) from ipca)) + mes ordem — a multiplicação usa *, os parênteses estão balanceados, e o alias ordem é atribuído corretamente à expressão.
Ordenação correta: order by ano, mes ordena cronologicamente, garantindo que a numeração sequencial siga a ordem dos dados.
A expressão calcula, para cada linha, o número de meses desde o início da série (janeiro de 2001) até o mês atual, gerando uma numeração de 1 a 276.
NÃO CAIA NESSA!
A banca explora a confusão entre usar min(ano) diretamente (errado, pois é agregação sem GROUP BY) e usar uma subconsulta (select min(ano) from ipca) (correto). Além disso, testa se você conhece a sintaxe correta de multiplicação (* e não x) e o balanceamento de parênteses. Fique atento: em SQL, toda função de agregação precisa de um contexto claro — ou GROUP BY, ou uma subconsulta escalar.
PEGA ESSA DICA!
Para resolver questões de numeração sequencial sem ROW_NUMBER(), pense em uma fórmula aritmética que transforme a combinação de colunas em um número. No caso de dados mensais, a fórmula 12*(ano - ano_mínimo) + mês é clássica. Sempre verifique: (1) a subconsulta está completa (from tabela)? (2) os parênteses estão balanceados? (3) o operador de multiplicação é *? (4) a ordenação está correta? Esses quatro pontos eliminam a maioria dos distratores.