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
fg165269
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )

ATENÇÃO: use a tabela relacional IPCA a seguir para responder à questão.

 

Tabela IPCA

indice

ano

mes

0,56

202312

0,28

202311

0,24

202310

. . .

. . .

. . .

0,2

20037

-0,15

20036

. . .

. . .

. . .

2,25

20031
2,1200212
3,02200211

. . .

. . .

. . .

0,5720011

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.

 

No contexto da tabela IPCA apresentada, o comando SQL a seguir produz o índice acumulado a cada ano, que é obtido pela multiplicação acumulativa de um conjunto de termos da forma (1 + i/100), onde i é o valor do índice em cada um dos doze meses de cada ano.

 

select
   Y.ano,
    (1+ m1.indice/100) * (1+ m2.indice/100) *
    (1+ m3.indice/100) * (1+ m4.indice/100) *
    (1+ m5.indice/100) * (1+ m6.indice/100) *
    (1+ m7.indice/100) * (1+ m8.indice/100) *
    (1+ m9.indice/100) * (1+ m10.indice/100) *
    (1+ m11.indice/100) * (1+ m12.indice/100) índice


from IPCA m1, IPCA m2, IPCA m3, IPCA m4,
        IPCA m5, IPCA m6, IPCA m7, IPCA m8,
        IPCA m9, IPCA m10, IPCA m11, IPCA m12,
        . . . . . . . . Y
where
        m12.mes =12 and m11.mes=11 and m10.mes=10
 and m9.mes =9 and m8.mes =8 and m7.mes=7
 and m6.mes =6 and m5.mes =5 and m4.mes=4
 and m3.mes =3 and m2.mes =2 and m1.mes=1


 and m12.ano = m11.ano and m11.ano = m10.ano
 and m10.ano = m9.ano and m9.ano = m8.ano
 and m8.ano = m7.ano and m7.ano = m6.ano
 and m6.ano = m5.ano and m5.ano = m4.ano
 and m4.ano = m3.ano and m3.ano = m2.ano
 and m2.ano = m1.ano
 and m1.ano = Y.ano
order by 1

 

Assinale o trecho que deve substituir o trecho pontilhado do comando acima, de modo que o cálculo e a apresentação sejam produzidos corretamente.

  1. A(select ano - 2021 as ano from IPCA)
  2. B(select ano from IPCA)
  3. C(select distinct ano from IPCA)
  4. D(select distinct ano, mes from IPCA)
  5. Eselect distinct ano from IPCA
Revelar gabarito e comentário

GabaritoC — (select distinct ano from IPCA)

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: DISTINCT e a tabela de anos

Gabarito: letra C. O trecho pontilhado deve ser (select distinct ano from IPCA), pois a tabela Y precisa fornecer um único registro por ano para que o produto cartesiano com as doze ocorrências mensais (m1 a m12) gere exatamente uma linha por ano — e não uma linha por mês, o que multiplicaria o resultado por 12. A cláusula DISTINCT é o que garante essa unicidade, eliminando as duplicatas de ano na tabela derivada.

O comando SQL apresentado é um exemplo clássico de auto-junção (self-join) com doze ocorrências da mesma tabela, uma para cada mês do ano. A ideia é que cada ocorrência m1 a m12 represente um mês específico (m1 = janeiro, m2 = fevereiro, ..., m12 = dezembro), e a condição m1.ano = m2.ano = ... = m12.ano garante que todas as doze linhas pertençam ao mesmo ano. O produto cartesiano dessas doze ocorrências, filtrado pelas condições de mês e ano, produz uma linha para cada combinação possível de doze meses do mesmo ano — ou seja, uma linha por ano, contendo os doze índices mensais necessários para o cálculo do acumulado.

O papel da tabela Y nesse contexto é fornecer a lista de anos para os quais o cálculo deve ser feito. A condição m1.ano = Y.ano conecta cada combinação de doze meses a um ano específico. Se Y contivesse uma linha por mês (como na alternativa D), o produto cartesiano geraria doze linhas para cada ano — uma para cada mês —, e o resultado final teria 12 × 23 = 276 linhas em vez de 23. Por isso, é essencial que Y contenha apenas os anos distintos, sem repetição.

A alternativa C (select distinct ano from IPCA) é a única que atende a esse requisito: ela retorna uma lista de anos únicos (2001 a 2023), que é exatamente o que a consulta precisa para agrupar os doze meses de cada ano. As demais alternativas ou retornam anos repetidos (B), ou retornam combinações de ano e mês (D), ou têm sintaxe incorreta no contexto (A e E).

NÃO CAIA NESSA!

A banca explora a confusão entre SELECT ano e SELECT DISTINCT ano. Sem o DISTINCT, a tabela Y teria 276 linhas (uma por mês), e o produto cartesiano com as doze ocorrências geraria 276 × 12 = 3.312 linhas — um resultado completamente errado. O candidato que não percebe a necessidade de eliminar duplicatas cai na alternativa B.

  1. 1Y lista anos distintos
  2. 2Junção com 12 ocorrências (m1–m12)
  3. 3Uma linha por ano
  4. 4Cálculo do acumulado
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

(select ano - 2021 as ano from IPCA) — Esta alternativa subtrai 2021 do ano, transformando os valores de 2001–2023 em -20 a 2. Isso não corresponde a nenhuma necessidade da consulta: o cálculo do índice acumulado depende do ano real, não de um deslocamento arbitrário. Além disso, não usa DISTINCT, então a tabela derivada teria 276 linhas (uma por mês), o que multiplicaria o resultado por 12.

Alternativa B — ❌ Incorreta

(select ano from IPCA) — Esta alternativa retorna todos os anos, mas sem eliminar duplicatas. Como a tabela IPCA tem 276 linhas (23 anos × 12 meses), a tabela Y teria 276 linhas, e o produto cartesiano com as doze ocorrências geraria 276 × 12 = 3.312 linhas — um resultado com 12 linhas por ano, em vez de uma. O DISTINCT é indispensável para garantir a unicidade dos anos.

Alternativa C — ✅ Correta ⟵ GABARITO

(select distinct ano from IPCA) — Esta alternativa retorna apenas os anos distintos (2001 a 2023), resultando em 23 linhas. Isso é exatamente o que a consulta precisa: para cada ano, o produto cartesiano com as doze ocorrências (m1 a m12) gera uma única linha com os doze índices mensais, permitindo o cálculo correto do acumulado. A condição m1.ano = Y.ano conecta cada combinação de doze meses a um ano único, e o DISTINCT garante que não haja repetição.

Alternativa D — ❌ Incorreta

(select distinct ano, mes from IPCA) — Esta alternativa retorna combinações únicas de ano e mes, resultando em 276 linhas (uma por mês). Isso faz com que a tabela Y tenha uma linha para cada mês, e o produto cartesiano com as doze ocorrências geraria 276 × 12 = 3.312 linhas — um resultado com 12 linhas por ano, em vez de uma. O DISTINCT aqui é aplicado à combinação (ano, mes), não apenas ao ano, o que não resolve o problema.

Alternativa E — ❌ Incorreta

select distinct ano from IPCA — Esta alternativa tem o mesmo conteúdo da alternativa C, mas sem os parênteses. No contexto do comando, o trecho pontilhado está dentro da cláusula FROM, que exige uma subconsulta entre parênteses para ser tratada como tabela derivada. Sem os parênteses, a sintaxe é inválida — o SQL não reconhece select distinct ano from IPCA como uma tabela derivada no FROM.

Gabarito: letra C — a única alternativa que combina a eliminação de duplicatas (DISTINCT) com a sintaxe correta de subconsulta (parênteses).

Link permanente: /questoes/fg165269