Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2024

Banco de DadosSQL
Código
fg086711
Banca
FGV
Órgão
MF
Ano
2024
Nível
Superior
Cargo
Auditor Federal de Finanças e Controle - Área de Tecnologia da Informação (Operação e Infraestrutura) - manhã

                                                    Imagem da questão

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.Imagem associada para resolução da questão
  1. Aselect12*(ano-min(ano)) + mes ordem,*from ipcaorder by ano, mes
  2. Bselect12 x (ano-(select min(ano) from ipca)) + mes ordemfrom ipcaorder by ano, mes
  3. Cselect12*(ano-(select min(ano))) + mes ordem,*from ipcaorder by ano, mes
  4. Dselect12*(ano-min(ano) + mes ordem,*from ipcaorder by 1,2
  5. Eselect12*(ano-(select min(ano) from ipca)) + mes ordem,*from ipca iorder 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”.

SQL: numeração sequencial com subconsulta escalar

Gabarito: letra E. O comando correto calcula a numeração sequencial das linhas usando a expressão 12*(ano-(select min(ano) from ipca)) + mes, que gera um número único e crescente para cada combinação ano/mês, e ordena o resultado por ano, mes. A alternativa E é a única que combina a subconsulta correta para obter o menor ano da tabela com a sintaxe válida e a ordenação adequada.

A questão pede um comando SQL que produza as colunas ano, mes e indice da tabela IPCA, ordenadas por ano/mês, e precedidas por uma coluna com numeração sequencial das linhas a partir de 1. A tabela contém dados mensais do IPCA de 2001 a 2023, com colunas ano, mes e indice. O desafio é criar uma coluna de numeração que reflita a ordem cronológica dos registros.

A solução mais direta seria usar uma função de janela como ROW_NUMBER() OVER (ORDER BY ano, mes), que numera as linhas na ordem especificada. No entanto, as alternativas apresentadas não usam essa função; em vez disso, tentam calcular a numeração aritmeticamente. A ideia é transformar cada combinação ano/mês em um número sequencial único. Como cada ano tem 12 meses, a expressão 12 * (ano - ano_minimo) + mes gera um número que começa em 1 (para o menor ano e mês 1) e aumenta de 1 em 1 para cada mês subsequente. Por exemplo, para o ano 2001, mês 1, com ano mínimo 2001, temos 12*(2001-2001)+1 = 1; para 2001, mês 2, 12*0+2 = 2; e assim por diante. Para 2002, mês 1, 12*(2002-2001)+1 = 13, e assim sucessivamente.

Para obter o ano mínimo, é necessário usar uma subconsulta: (select min(ano) from ipca). Essa subconsulta retorna o menor valor da coluna ano na tabela. A alternativa E usa exatamente essa subconsulta, além de ordenar corretamente por ano, mes. As demais alternativas apresentam erros de sintaxe, de lógica ou de ordenação.

A pegadinha da questão está em identificar qual alternativa tem a sintaxe correta da subconsulta e a ordenação adequada. Algumas alternativas usam min(ano) sem a subconsulta, o que é inválido em SQL porque min() é uma função de agregação e não pode ser usada diretamente em uma expressão aritmética sem um GROUP BY. Outras têm erros de parênteses ou usam order by 1,2 em vez de order by ano, mes, o que pode não refletir a ordem desejada se a coluna de numeração for a primeira.

Alternativa A — ❌ Incorreta

A expressão 12*(ano-min(ano)) + mes usa min(ano) sem uma subconsulta. Em SQL, min() é uma função de agregação e, sem GROUP BY, ela retorna o mínimo de toda a tabela, mas não pode ser usada em uma expressão que envolve outras colunas sem agrupamento. Além disso, a sintaxe 12*(ano-min(ano)) + mes ordem,* tem um erro: o alias ordem está sem a palavra-chave AS (embora seja opcional em alguns bancos), e a vírgula antes de * é inválida — não se pode misturar uma expressão com * dessa forma. O correto seria select 12*(ano-(select min(ano) from ipca)) + mes as ordem, * from ipca. A alternativa A está incorreta.

Alternativa B — ❌ Incorreta

A expressão 12 x (ano-(select min(ano) from ipca)) + mes ordem usa x em vez de * para multiplicação, o que é inválido em SQL. O operador de multiplicação é *, não x. Além disso, falta a vírgula antes de * na lista de seleção, e o alias ordem está sem AS. A ordenação por ano, mes está correta, mas a sintaxe da expressão está errada. A alternativa B está incorreta.

Alternativa C — ❌ Incorreta

A expressão 12*(ano-(select min(ano))) + mes ordem,* tem uma subconsulta incompleta: (select min(ano)) não especifica a tabela de onde o mínimo deve ser extraído. Em SQL, uma subconsulta escalar deve ter uma cláusula FROM para indicar a tabela. O correto seria (select min(ano) from ipca). Além disso, a vírgula antes de * é inválida, e o alias ordem está sem AS. A alternativa C está incorreta.

Alternativa D — ❌ Incorreta

A expressão 12*(ano-min(ano) + mes ordem,* tem um erro de parênteses: falta um parêntese de fechamento após mes. A expressão correta seria 12*(ano-min(ano)) + mes. Além disso, usa min(ano) sem subconsulta, o que é inválido, e a vírgula antes de * é inválida. A ordenação por 1,2 é problemática: embora ORDER BY 1,2 ordene pela primeira e segunda colunas do resultado, a primeira coluna é a numeração calculada, não o ano. Isso pode não refletir a ordem cronológica desejada, pois a numeração já é sequencial, mas a ordenação por 1,2 ordenaria pela numeração e depois pelo ano, o que é redundante e pode não funcionar como esperado. A alternativa D está incorreta.

Alternativa E — ✅ Correta ⟵ GABARITO

A expressão 12*(ano-(select min(ano) from ipca)) + mes ordem,* está correta. A subconsulta (select min(ano) from ipca) retorna o menor ano da tabela, e a expressão 12*(ano - ano_minimo) + mes gera um número sequencial único para cada combinação ano/mês, começando em 1. A vírgula antes de * é válida, pois separa a expressão calculada das demais colunas. O alias ordem é opcional sem AS, e a ordenação por ano, mes garante que as linhas sejam exibidas em ordem cronológica. A alternativa E está correta.

Gabarito: letra E

Link permanente: /questoes/fg086711