Pular para o conteúdo principal

Questão de Banco de Dados — Oracle — FCC 2025

Banco de DadosOracle
Código
fc150347
Banca
FCC
Órgão
TRT 1
Ano
2025
Cargo
AJ TRT1
Um Analista de um Tribunal Regional do Trabalho foi solicitado a consultar os benefícios concedidos a funcionários de diferentes empresas e apresentar a quantidade total de benefícios pagos por empresa para aquelas que tenham concedido mais de 5 benefícios nos últimos 12 meses. Utilizando um banco de dados Oracle 19c, aberto e em condições ideais, o comando que faz a consulta é:
  1. ASELECT empresa, COUNT(*) AS total_beneficios FROM beneficios WHERE data_concessao BETWEEN SYSDATE AND SYSDATE - 365 GROUP BY empresa HAVING COUNT(*) > 5;
  2. BSELECT empresa, COUNT(*) AS total_beneficios FROM beneficios WHERE data_concessao <= ADD_MONTHS(SYSDATE, -12) GROUP BY empresa HAVING COUNT() > 5;
  3. CSELECT empresa, COUNT(*) AS total_beneficios FROM beneficios WHERE data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12) GROUP BY empresa HAVING COUNT(*) > 5;
  4. DSELECT empresa, COUNT(*) AS total_beneficios FROM beneficios WHERE EXTRACT(YEAR FROM data_concessao) := EXTRACT(YEAR FROM SYSDATE) - 1 GROUP BY empresa HAVING COUNT(*) > 5;
  5. ESELECT empresa, SUM(beneficio) AS total_beneficios FROM beneficios WHERE data_concessao >= ADD_MONTHS(SYSDATE, -12) GROUP BY empresa HAVING SUM(beneficio) > 5;
Revelar gabarito e comentário

GabaritoC — SELECT empresa, COUNT(*) AS total_beneficios FROM beneficios WHERE data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12) GROUP BY empresa HAVING COUNT(*) > 5;

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 no Oracle: filtro por data e agrupamento com HAVING

Gabarito: letra C. A consulta correta usa WHERE data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12) para selecionar os benefícios dos últimos 12 meses, GROUP BY empresa para agrupar por empresa e HAVING COUNT(*) > 5 para filtrar apenas as empresas com mais de 5 benefícios. A alternativa C é a única que combina corretamente a função ADD_MONTHS com TRUNC(SYSDATE) e a comparação >=, garantindo que a data de concessão seja a partir de 12 meses atrás.

A questão exige conhecimento de SQL em Oracle, especificamente sobre filtragem de datas e agrupamento com condição. Vamos entender cada parte:

  1. Filtro por data: Para considerar os benefícios concedidos nos últimos 12 meses, precisamos comparar a coluna data_concessao com uma data limite. A função ADD_MONTHS(SYSDATE, -12) retorna a data exatamente 12 meses antes da data atual. Usar >= garante que incluímos todos os registros a partir dessa data. O uso de TRUNC(SYSDATE) remove a parte de horas, considerando apenas a data (meia-noite), o que é uma boa prática para evitar problemas com horários.

  1. Agrupamento: GROUP BY empresa agrupa os registros por empresa, permitindo calcular a quantidade de benefícios por empresa.

  1. Filtro após agrupamento: HAVING COUNT(*) > 5 filtra os grupos que têm mais de 5 registros, ou seja, empresas com mais de 5 benefícios.

A alternativa C é a única que atende a todos os requisitos. Vamos analisar cada alternativa para entender os erros.

  1. 1WHERE data >= ADD_MONTHS(TRUNC(SYSDATE), -12)
  2. 2GROUP BY empresa
  3. 3HAVING COUNT(*) > 5
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O erro está na condição WHERE data_concessao BETWEEN SYSDATE AND SYSDATE - 365. O operador BETWEEN é inclusivo, mas a ordem está invertida: BETWEEN SYSDATE AND SYSDATE - 365 significa que o valor deve ser maior ou igual a SYSDATE e menor ou igual a SYSDATE - 365, o que é impossível, pois SYSDATE é maior que SYSDATE - 365. O correto seria BETWEEN SYSDATE - 365 AND SYSDATE. Além disso, usar SYSDATE - 365 não considera anos bissextos, enquanto ADD_MONTHS é mais preciso.

Alternativa B — ❌ Incorreta

A condição WHERE data_concessao <= ADD_MONTHS(SYSDATE, -12) está invertida: deveria ser >= para incluir os últimos 12 meses. Além disso, há um erro de sintaxe: HAVING COUNT() > 5 está sem o asterisco (COUNT(*)).

Alternativa C — ✅ Correta ⟵ GABARITO

A consulta está correta: WHERE data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12) seleciona os registros a partir de 12 meses atrás, GROUP BY empresa agrupa por empresa e HAVING COUNT(*) > 5 filtra as empresas com mais de 5 benefícios. O uso de TRUNC(SYSDATE) é adequado para considerar apenas a data, sem horas.

Alternativa D — ❌ Incorreta

A condição WHERE EXTRACT(YEAR FROM data_concessao) := EXTRACT(YEAR FROM SYSDATE) - 1 usa o operador := que é de atribuição em PL/SQL, não de comparação (deveria ser =). Além disso, a lógica está errada: ela compara o ano da concessão com o ano anterior, mas não considera o mês e o dia, podendo incluir registros de mais de 12 meses atrás (por exemplo, se hoje é 2025-03-10, registros de 2024-01-01 seriam incluídos, mas já passaram mais de 12 meses).

Alternativa E — ❌ Incorreta

A consulta usa SUM(beneficio) em vez de COUNT(*). O enunciado pede a quantidade total de benefícios, não a soma de valores. Além disso, HAVING SUM(beneficio) > 5 filtra pela soma, não pela contagem. Se a coluna beneficio não existir ou for numérica, a consulta pode até funcionar, mas não atende ao requisito.

Gabarito: letra C

Link permanente: /questoes/fc150347