Um órgão público mantém um banco de dados relacional para c...

Próximas questões
Com base no mesmo assunto
Q3992114 Banco de Dados
Um órgão público mantém um banco de dados relacional para controle de contratos administrativos, estruturado nas seguintes tabelas simplificadas: SERVIDOR (id_servidor, nome, lotacao), CONTRATO (id_contrato, id_servidor, valor, data_inicio, data_fim) e PAGAMENTO (id_pagamento, id_contrato, valor_pago, data_pagamento). Cada contrato vincula-se a um único servidor e pode registrar múltiplos pagamentos. Deseja-se identificar os servidores cuja soma dos valores pagos no ano de 2025 ultrapassou R$ 100.000,00, considerando apenas contratos que permaneçam vigentes em 31/12/2025. A consulta deve retornar o nome do servidor e o total pago no período, sem incluir servidores que não tenham recebido pagamentos em 2025. Assinale a alternativa CORRETA que atende adequadamente ao enunciado:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: D

Fundamento decisivo: O ponto decisivo era combinar corretamente as tabelas, limitar os pagamentos ao ano de 2025, considerar apenas contratos vigentes em 31/12/2025 e aplicar o corte sobre a soma em HAVING. Entre as alternativas, só a D reúne esses requisitos de forma adequada, sem erro nas chaves de junção e sem desrespeitar o critério temporal ou o filtro agregado.

Tema central: junções corretas, filtro temporal de 2025, vigência em 31/12/2025 e HAVING em consulta SQL
Análise das alternativas
A
Errada
Está errada porque faz a junção de PAGAMENTO com CONTRATO pela coluna errada: usa p.id_pagamento = c.id_contrato, quando o correto é p.id_contrato = c.id_contrato. Também não limita os pagamentos ao ano de 2025, não verifica se o contrato estava vigente em 31/12/2025 e não aplica o filtro de soma acima de 100000 com HAVING.
B
Errada
Erra estruturalmente os relacionamentos: usa servidor.id_servidor = contrato.id_contrato e contrato.id_contrato = pagamento.id_pagamento, ambas incompatíveis com as chaves indicadas. Além disso, não há verificação de vigência em 31/12/2025 nem filtro do total agregado superior a 100000 com HAVING.
C
Errada
As junções estão corretas, mas o filtro temporal dos pagamentos não atende ao enunciado, porque inclui pagamentos desde 2024 com BETWEEN '2024-01-01' AND '2025-12-31'. A questão pedia considerar apenas pagamentos de 2025. Além disso, a vigência foi tratada apenas com c.data_fim >= '2025-12-31', sem contemplar data_fim nula, hipótese compatível com contrato ainda vigente.
D
Certa
A alternativa D usa as junções corretas entre SERVIDOR, CONTRATO e PAGAMENTO, filtra os pagamentos no intervalo de 2025 com BETWEEN '2025-01-01' AND '2025-12-31' e aplica a restrição de contrato vigente em 31/12/2025. Também agrupa por servidor e deixa o total acima de 100000 para o HAVING, que é o local adequado para esse tipo de filtro.
E
Errada
A junção básica está adequada, mas a alternativa não adere corretamente a dois pontos decisivos. Primeiro, usa HAVING SUM(p.valor_pago) >= 100000, enquanto o enunciado diz 'ultrapassou' 100000, o que corresponde a > 100000. Segundo, trata a vigência apenas com c.data_fim >= '2025-12-31', sem considerar data_fim nula. O uso de LEFT JOIN também não traz vantagem aqui, porque o WHERE sobre p.data_pagamento elimina o efeito inclusivo de registros sem pagamento.
Pegadinha da questão
A confusão principal era misturar a chave primária de PAGAMENTO (id_pagamento) com a chave usada para relacioná-lo ao CONTRATO (id_contrato), além de trocar o critério literal de 'ultrapassou' por >= 100000.
Dica para questões semelhantes
  • Em consulta com soma por grupo, o corte sobre o resultado agregado deve ser feito em HAVING, não em WHERE.
  • Antes de olhar sintaxe geral, confira se as junções usam exatamente as chaves de relacionamento corretas entre as tabelas.
  • Quando o enunciado fala em vigência numa data específica, verifique se a condição cobre início anterior ou igual à data e término nulo ou posterior/igual à data.
  • Se o texto exigir apenas registros com ocorrência no período, INNER JOIN com o filtro temporal costuma ser suficiente para excluir ausentes.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo