Considere o script SQL a seguir. CREATE TABLE PROCESSOS ( id_processo INT PRIMARY KEY, comarca VARCHAR(100) NOT NULL, status VARCHAR(50) NOT NULL ); INSERT INTO PROCESSOS (id_processo, comarca, status) VALUES (1, 'Comarca A', 'Ativo'), (2, 'Comarca A', 'Inativo'), (3, 'Comarca B', 'Ativo'), (4, 'Comarca C', 'Cancelado'), (5, 'Comarca B', 'Ativo'); Para listar apenas as comarcas que possuem mais de um processo ativo, deve-se utilizar a query:
ASELECT comarca FROM PROCESSOS WHERE status = 'Ativo' GROUP BY comarca HAVING COUNT(*) > 1;
BSELECT DISTINCT comarca FROM PROCESSOS WHERE id_processo IN ( SELECT id_processo FROM PROCESSOS WHERE status = 'Ativo');
CSELECT comarca FROM PROCESSOS WHERE status = 'Ativo' AND id_processo >= 1;
DSELECT comarca FROM PROCESSOS WHERE status = 'Inativo' GROUP BY comarca HAVING COUNT(*) > 1;
ESELECT comarca FROM PROCESSOS GROUP BY comarca ORDER BY COUNT(*) DESC;
Revelar gabarito e comentário▾
GabaritoA — SELECT comarca
FROM PROCESSOS
WHERE status = 'Ativo'
GROUP BY comarca
HAVING COUNT(*) > 1;
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”.
Consulta SQL com GROUP BY e HAVING: agrupamento e filtro de grupos
Gabarito: letra A. A consulta correta filtra as linhas com status = 'Ativo', agrupa por comarca e usa HAVING COUNT(*) > 1 para selecionar apenas os grupos com mais de um processo ativo — é a combinação clássica de WHERE (filtro de linhas) com HAVING (filtro de grupos). A alternativa A é a única que aplica exatamente essa lógica.
A questão cobra o uso de agregação e filtro sobre grupos em SQL. Quando precisamos responder a perguntas do tipo "quais grupos têm mais de X elementos?", não basta o WHERE, porque ele filtra linhas individuais antes do agrupamento. O HAVING é a cláusula que filtra grupos já formados, permitindo usar funções de agregação como COUNT(*), SUM(), AVG() etc. A ordem lógica de execução de uma consulta com agrupamento é:
FROM — define a tabela de origem;
WHERE — filtra as linhas (não pode usar agregação);
GROUP BY — agrupa as linhas restantes;
HAVING — filtra os grupos (pode usar agregação);
SELECT — projeta as colunas (após o agrupamento, só colunas do GROUP BY ou agregações);
ORDER BY — ordena o resultado.
No caso concreto, a tabela PROCESSOS tem 5 registros, dos quais 3 são 'Ativo' (ids 1, 3 e 5). Agrupando por comarca, temos:
Comarca A: 1 ativo (id 1);
Comarca B: 2 ativos (ids 3 e 5);
Comarca C: 0 ativos.
O HAVING COUNT(*) > 1 mantém apenas a Comarca B, que é o resultado esperado. A pegadinha da banca está em confundir WHERE com HAVING: o WHERE não pode usar agregações, e o HAVING só existe após o GROUP BY. Além disso, a alternativa D filtra status = 'Inativo', o que não atende ao enunciado.
1FROM
2WHERE
3GROUP BY
4HAVING
5SELECT
6ORDER BY
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A consulta filtra as linhas com status = 'Ativo', agrupa por comarca e usa HAVING COUNT(*) > 1 para selecionar apenas os grupos com mais de um processo ativo. É exatamente a lógica pedida: primeiro reduzimos ao conjunto de processos ativos, depois agrupamos por comarca e, por fim, filtramos os grupos que têm mais de um elemento. O COUNT(*) conta as linhas de cada grupo, e o HAVING aplica a condição sobre o grupo já formado.
Alternativa B — ❌ Incorreta
A consulta usa SELECT DISTINCT comarca com um IN que seleciona todos os id_processo com status = 'Ativo'. Isso retorna as comarcas que têm pelo menos um processo ativo, não as que têm mais de um. O DISTINCT elimina duplicatas, mas não faz contagem nem filtra por quantidade. O resultado incluiria Comarca A (1 ativo) e Comarca B (2 ativos), mas também Comarca A, que não deveria aparecer.
Alternativa C — ❌ Incorreta
A consulta filtra status = 'Ativo' e id_processo >= 1, o que retorna todos os processos ativos (ids 1, 3 e 5), mas não agrupa nem conta. O resultado seria uma lista de comarcas com repetições (Comarca A, Comarca B, Comarca B), sem qualquer agregação. Não atende ao requisito de "mais de um processo ativo".
Alternativa D — ❌ Incorreta
A consulta filtra status = 'Inativo', o que é o oposto do pedido. O enunciado quer comarcas com mais de um processo ativo, não inativo. Além disso, mesmo que o filtro fosse correto, o HAVING COUNT(*) > 1 seria aplicado sobre os grupos de inativos, o que não resolve a questão.
Alternativa E — ❌ Incorreta
A consulta agrupa por comarca e ordena por COUNT(*) DESC, mas não filtra por status = 'Ativo' nem aplica HAVING. O resultado seria uma lista de todas as comarcas com a contagem total de processos (incluindo inativos e cancelados), ordenada da maior para a menor. Não há filtro para processos ativos nem condição de mínimo.