Questão nº 40
Questão de Tecnologia da Informação · FCC TRT-1 2025 (nº 40)
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 é:
- A```sql
SELECT empresa, COUNT() AS total_beneficios
FROM beneficios
WHERE data_concessao BETWEEN SYSDATE AND SYSDATE - 365
GROUP BY empresa
HAVING COUNT() > 5;
``` - B```sql
SELECT empresa, COUNT(*) AS total_beneficios
FROM beneficios
WHERE data_concessao <= ADD_MONTHS(SYSDATE, -12)
GROUP BY empresa
HAVING COUNT( ) > 5;
``` - C```sql
SELECT empresa, COUNT() AS total_beneficios
FROM beneficios
WHERE data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12)
GROUP BY empresa
HAVING COUNT() > 5;
``` (alternativa correta) - D```sql
SELECT empresa, COUNT() AS total_beneficios
FROM beneficios
WHERE EXTRACT(YEAR FROM data_concessao) := EXTRACT(YEAR FROM SYSDATE) - 1
GROUP BY empresa
HAVING COUNT() > 5;
``` - E```sql
SELECT empresa, SUM(beneficio) AS total_beneficios
FROM beneficios
WHERE data_concessao >= ADD_MONTHS(SYSDATE, -12)
GROUP BY empresa
HAVING SUM(beneficio) > 5;
```
Resposta comentada
Gabarito Alternativa C
Para encontrar a quantidade de itens por grupo em um período específico, usamos as cláusulas `WHERE` para filtrar as datas, `GROUP BY` para agrupar os resultados e `HAVING` para filtrar os grupos com base em uma condição agregada.
(A) Incorreta: A condição `WHERE data_concessao BETWEEN SYSDATE AND SYSDATE - 365` está logicamente invertida. A função `BETWEEN` espera que o primeiro valor seja menor ou igual ao segundo, o que não ocorre aqui, resultando em nenhuma linha. Mesmo corrigida, `SYSDATE - 365` não é a forma mais precisa de calcular "últimos 12 meses" em Oracle.
(B) Incorreta: A condição `WHERE data_concessao <= ADD_MONTHS(SYSDATE, -12)` seleciona benefícios concedidos antes ou no dia de 12 meses atrás, ou seja, benefícios mais antigos, o oposto do que foi pedido ("nos últimos 12 meses").
(C) Correta: Esta alternativa filtra corretamente os dados. `TRUNC(SYSDATE)` remove a parte da hora da data atual, garantindo que a contagem dos "últimos 12 meses" comece exatamente no início do dia de 12 meses atrás. `ADD_MONTHS(..., -12)` calcula a data 12 meses antes. A condição `data_concessao >= ADD_MONTHS(TRUNC(SYSDATE), -12)` seleciona todos os benefícios concedidos a partir do início do dia de 12 meses atrás até o momento atual. `GROUP BY empresa` agrupa os resultados por empresa, e `HAVING COUNT() > 5` filtra apenas as empresas que concederam mais de 5 benefícios.
(D) Incorreta: O operador `:=` é de atribuição em PL/SQL, não de comparação em SQL; o correto seria `=`. Além disso, `EXTRACT(YEAR FROM data_concessao) = EXTRACT(YEAR FROM SYSDATE) - 1` filtra apenas os benefícios do ano calendário anterior, e não dos "últimos 12 meses" em um período contínuo.
(E) Incorreta: (Armadilha da banca) A questão pede a quantidade total de benefícios (`COUNT()`), e não a soma dos valores dos benefícios (`SUM(beneficio)`). Esta alternativa usa `SUM(beneficio)` tanto na seleção quanto na condição `HAVING`, o que não atende ao requisito de contar o número de benefícios.
Fonte: FCC TRT-1 2025 Analista Judiciário - Área Apoio Especializado - Especialidade Tecnologia da Informação (Caderno Tipo 004). Reproduzida para fins de estudo.