Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fc150343
Banca
FCC
Órgão
TRT 15
Ano
2025
Cargo
AJ TRT15
Em um banco de dados Oracle 19c, aberto e funcionando em condições ideias, existe uma tabela tprocessos com dados válidos, que tem a seguinte estrutura: - id_processo (número único de identificação do processo) - data_abertura (data em que o processo foi aberto) - id_vara (identificador da vara do trabalho onde o processo tramita) - valor_processo (valor monetário associado ao processo) O comando SQL que lista o id_vara, o número total de processos por vara e o valor total dos processos, em ordem decrescente, somente das varas que possuem mais de 100 processos abertos antes de 1º de janeiro de 2020, é:
ASELECT id_vara, COUNT (*) AS total_processos, SUM(valor_processo) AS valor_total FROM tprocessos WHERE data_abertura < '2020-01-01' GROUP BY id_vara HAVING COUNT (*) > 100 ORDER BY SUM(valor processo) DESC;
BSELECT id_vara, COUNT(*) AS total_processos, SUM(valor_processo) AS valor_total FROM tprocessos WHERE data abertura < '2020-01-01' GROUP BY id_vara ORDER BY SUM(valor processo) DESC HAVING COUNT(*) > 100;
CSELECT id_vara, COUNT(id_processo) AS total_processos, SUM(valor_processo) AS valor_total FROM tprocessos WHERE data abertura < '2020-JAN-01' GROUP BY id vara HAVING COUNT (id_processo) > 100 ORDER BY COUNT (valor_total);
DSELECT id_vara, COUNT (*) AS total_processos, SUM(valor_processo) AS valor_total FROM tprocessos WHERE data abertura <= '2020-01-01' GROUP BY id_vara ORDER BY valor_total;
ESELECT id_vara, COUNT(*) AS total_processos, SUM(valor_processo) AS valor_total FROM tprocessos WHERE data abertura < '2020-01-01' GROUP BY id_vara HAVING SUM(valor_processo) > 100000 ORDER BY valor_total DESC;
Revelar gabarito e comentário▾
GabaritoA — SELECT id_vara, COUNT (*) AS total_processos, SUM(valor_processo) AS valor_total
FROM tprocessos
WHERE data_abertura < '2020-01-01'
GROUP BY id_vara
HAVING COUNT (*) > 100
ORDER BY SUM(valor processo) DESC;
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: agrupamento com GROUP BY, filtro com HAVING e ordenação
Gabarito: letra A. A consulta correta precisa filtrar os processos abertos antes de 1º de janeiro de 2020 (WHERE), agrupar por vara (GROUP BY id_vara), contar e somar os valores por grupo, manter apenas os grupos com mais de 100 processos (HAVING COUNT(*) > 100) e ordenar o resultado pelo valor total em ordem decrescente (ORDER BY SUM(valor_processo) DESC). A alternativa A é a única que apresenta todas essas cláusulas na ordem sintaticamente correta e com a semântica exata pedida.
O comando SQL é uma linguagem declarativa: você diz o que quer obter, não como obter. Para responder a essa questão, é preciso dominar a função de cada cláusula e, principalmente, a ordem lógica de execução de uma consulta, que não é a ordem em que escrevemos o comando. O banco de dados processa a consulta na seguinte sequência: primeiro o FROM (define a tabela), depois o WHERE (filtra as linhas individuais), em seguida o GROUP BY (agrupa as linhas que sobreviveram ao filtro), depois o HAVING (filtra os grupos), na sequência o SELECT (calcula as expressões e projeções) e, por fim, o ORDER BY (ordena o resultado final).
Essa ordem explica os dois erros clássicos que a banca explora nesta questão. O primeiro: o WHERE filtra linhas antes do agrupamento, então não pode usar funções de agregação como COUNT(*) ou SUM(...) — isso é papel do HAVING, que filtra grupos depois do GROUP BY. O segundo: o ORDER BY é a última cláusula a ser executada, por isso pode referenciar os apelidos (alias) criados no SELECT, como valor_total — algo que o WHERE e o HAVING não podem fazer, pois são executados antes.
Vamos aplicar isso ao enunciado. Precisamos listar id_vara, o total de processos por vara e o valor total, em ordem decrescente, somente das varas com mais de 100 processos abertos antes de 1º de janeiro de 2020. O filtro de data (data_abertura < '2020-01-01') é um filtro de linha, então vai no WHERE. O agrupamento por vara é o GROUP BY id_vara. A condição "mais de 100 processos" é uma condição sobre o grupo (o resultado da agregação COUNT(*)), então vai no HAVING. A ordenação decrescente pelo valor total é o ORDER BY SUM(valor_processo) DESC. A alternativa A é a única que monta exatamente essa estrutura.
A pegadinha central desta questão é a ordem das cláusulas e a função de cada uma. A banca mistura a posição do HAVING (que deve vir depois do GROUP BY e antes do ORDER BY), troca o operador de comparação (< por <=), usa COUNT(id_processo) em vez de COUNT(*) (o que não muda o resultado, mas foge do pedido), e até inventa uma ordenação por COUNT(valor_total) que não faz sentido. Guarde a sequência lógica de execução e a fronteira entre WHERE (filtra linha) e HAVING (filtra grupo): é exatamente nesses dois pontos que as alternativas se dividem.
1FROM (tabela)
2WHERE (filtra linhas)
3GROUP BY (agrupa)
4HAVING (filtra grupos)
5SELECT (projeta)
6ORDER BY (ordena)
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A consulta está sintaticamente correta e semanticamente exata. O WHERE data_abertura < '2020-01-01' filtra apenas os processos abertos antes da data limite (o enunciado pede "antes de 1º de janeiro de 2020", portanto o operador < é o correto, excluindo o dia 1º de janeiro). O GROUP BY id_vara agrupa os registros por vara. O HAVING COUNT(*) > 100 mantém somente os grupos com mais de 100 processos — repare que o HAVING vem depois do GROUP BY e antes do ORDER BY, na posição correta. O ORDER BY SUM(valor_processo) DESC ordena o resultado pelo valor total em ordem decrescente, exatamente como pedido. Todas as cláusulas estão na ordem lógica de execução correta.
Alternativa B — ❌ Incorreta
O erro está na posição do HAVING: ele aparece depois do ORDER BY. A ordem correta das cláusulas é GROUP BY → HAVING → ORDER BY. O HAVING filtra os grupos antes da ordenação final; colocá-lo depois do ORDER BY é um erro de sintaxe no Oracle e em qualquer SGBD relacional. A banca inverteu a posição para testar se o candidato conhece a ordem lógica de execução.
Alternativa C — ❌ Incorreta
Esta alternativa acumula vários erros. Primeiro, a data está no formato '2020-JAN-01', que não é um formato de data padrão reconhecido pelo Oracle sem conversão explícita (o formato padrão é 'YYYY-MM-DD' ou com TO_DATE). Segundo, o GROUP BY id vara tem um espaço no nome da coluna (id vara em vez de id_vara), o que o tornaria um identificador inválido. Terceiro, o ORDER BY COUNT(valor_total) não faz sentido: COUNT conta linhas, não soma valores, e valor_total é um apelido que representa a soma, não uma coluna a ser contada. O correto seria ORDER BY SUM(valor_processo) DESC.
Alternativa D — ❌ Incorreta
O erro está no operador de comparação da data: data_abertura <= '2020-01-01' inclui os processos abertos no dia 1º de janeiro de 2020, mas o enunciado pede os processos abertos antes dessa data (<). Além disso, a consulta não tem a cláusula HAVING, então não filtra as varas com mais de 100 processos — ela retornaria todas as varas, independentemente da quantidade. E o ORDER BY valor_total ordena em ordem crescente (padrão), enquanto o pedido é decrescente (DESC).
Alternativa E — ❌ Incorreta
O erro está na condição do HAVING: HAVING SUM(valor_processo) > 100000 filtra as varas cujo valor total dos processos é maior que 100.000, mas o enunciado pede as varas com mais de 100 processos (COUNT(*) > 100). A banca trocou a função de agregação: em vez de contar os processos, somou os valores. Além disso, o ORDER BY valor_total DESC referencia o apelido valor_total, o que é válido, mas a condição do HAVING está errada.
NÃO CAIA NESSA!
A banca adora inverter a posição do HAVING (como na alternativa B) e trocar a função de agregação no filtro de grupo (como na E). Lembre-se: o WHERE filtra linhas antes do agrupamento; o HAVING filtra grupos depois do GROUP BY. E a ordem de execução é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Com esse mapa mental, você enxerga essas trocas de longe 💪