Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas 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

anomês

0,56

202312

0,28

202311

0,24

202310

. . .

. . .. . .

0,2

20037

-0,15

20036

. . .

. . .

. . .

2,25

20031

2,1

200212

3,02

200211

. . .

. . .

. . .

0,57

20011

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.

  1. Aselect     12*(ano-min(ano)) + mes ordem,*      from ipca      order by ano, mes
  2. Bselect     12 x (ano-(select min(ano) from ipca)) + mes ordem     from ipca     order by ano, mes
  3. Cselect     12*(ano-(select min(ano))) + mes ordem,*      from ipca      order by ano, mes
  4. Dselect     12*(ano-min(ano) + mes ordem,*     from ipca     order by 1,2
  5. 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 é:

ordem=12×(anoano_mıˊnimo)+meˆs\text{ordem} = 12 \times (\text{ano} - \text{ano\_mínimo}) + \text{mês}

Vamos entender por que essa fórmula funciona. Se o ano mínimo é 2001, então para janeiro de 2001 (mês 1), temos: 12×(20012001)+1=112 \times (2001 - 2001) + 1 = 1. Para dezembro de 2001 (mês 12): 12×0+12=1212 \times 0 + 12 = 12. Para janeiro de 2002: 12×1+1=1312 \times 1 + 1 = 13. E assim por diante, até dezembro de 2023: 12×22+12=27612 \times 22 + 12 = 276. 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:

  1. Subconsulta correta: (select min(ano) from ipca) retorna o menor ano da tabela (2001), permitindo o cálculo da numeração.

  2. 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.

  3. 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.

Gabarito: letra E

Link permanente: /questoes/fg165264