Questão nº 38
Questão de Tecnologia da Informação · FGV STN 2024 (nº 38)
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.
- A```
select
12(ano-min(ano)) + mes ordem,
from ipca
order by ano, mes
``` - B```
select
12 x (ano-(select min(ano) from ipca)) + mes ordem
from ipca
order by ano, mes
``` - C```
select
12(ano-(select min(ano))) + mes ordem,
from ipca
order by ano, mes
``` - D```
select
12(ano-min(ano) + mes ordem,
from ipca
order by 1,2
``` - E```
select
12(ano-(select min(ano) from ipca)) + mes ordem,
from ipca i
order by ano, mes
``` (alternativa correta)
Resposta comentada
Gabarito Alternativa E
Para criar uma numeração sequencial baseada em ano e mês, usamos uma fórmula que converte cada par (ano, mês) em um número único e crescente. A chave é encontrar o menor ano (min(ano)) da tabela para usá-lo como base no cálculo, garantindo que a numeração comece de forma consistente.
E) Correta: Esta é a alternativa que implementa corretamente a lógica.
12*(ano-(select min(ano) from ipca)) + mes: Calcula a ordem sequencial. A subconsulta(select min(ano) from ipca)obtém o menor ano de toda a tabela, que é essencial para a base do cálculo.12 * (ano - menor_ano) + mestransforma cada par (ano, mês) em um número único e sequencial.ordem: Alias (apelido) para a coluna calculada.*: Seleciona todas as outras colunas (ano,mes,indice) da tabelaipca.from ipca i: Seleciona os dados da tabelaipca(oié um alias para a tabela, opcional aqui).order by ano, mes: Garante que o resultado final esteja ordenado corretamente por ano e mês.
A) Incorreta: O uso de min(ano) diretamente na lista de SELECT sem uma cláusula GROUP BY e misturado com colunas não agregadas (ano, mes) é um erro de sintaxe na maioria dos sistemas de banco de dados SQL padrão. min(ano) é uma função de agregação e precisa de um GROUP BY para funcionar com colunas individuais, ou ser usada como uma subconsulta escalar para obter um único valor para toda a tabela. Armadilha da banca: Esta é a alternativa mais tentadora, pois parece intuitiva usar min(ano), mas a sintaxe está incorreta para o que se deseja (um valor escalar para cada linha).
B) Incorreta:
12 x (ano-(select min(ano) from ipca)): O operador de multiplicação em SQL é*, nãox. Isso causaria um erro de sintaxe.- A consulta não inclui
*para selecionar as colunasano,meseindice, apenas a colunaordem.
C) Incorreta:
(select min(ano)): A subconsulta está faltando a cláusulaFROM, ou seja, não especifica de qual tabela deve obter omin(ano). Isso resultaria em um erro de sintaxe.
D) Incorreta:
12*(ano-min(ano) + mes ordem,*: Há um erro de sintaxe na expressão. O parêntese paramin(ano)não está fechado corretamente antes do+ mes. Além disso, o uso demin(ano)diretamente na lista deSELECTsemGROUP BY(como na alternativa A) é incorreto.order by 1,2: Embora válido para ordenar pelas primeiras duas colunas do resultado, o cálculo principal está errado.
Fonte: FGV STN 2024 Auditor Federal de Finanças e Controle - Tecnologia da Informação (Operação e Infraestrutura) (Caderno Tipo 1). Reproduzida para fins de estudo.
