Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024

Banco de DadosConsultas e Comandos em SQL
Código
ce403646
Banca
CESPE / CEBRASPE
Órgão
TCE AC
Ano
2024
Cargo
ATI ( )
A figura a seguir representa um projeto de banco de dados para a análise de gastos em saúde por município e por hospital.   A partir dessas informações, julgue o próximo item.   A execução da consulta SQL a seguir listará os nomes dos hospitais que tiveram gastos superiores à média geral de gastos. SELECT nome_hospital, sum(g.valor_gasto) as total FROM gastos g JOIN hospital h ON g.id_hospital = h.id_hospital group by nome_hospital having sum(g.valor_gasto) >  (SELECT AVG(valor_gasto)  FROM gastos) ORDER BY nome_hospitalImagem associada para resolução da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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 – GROUP BY, HAVING e subconsulta com AVG

Gabarito: Certo. A consulta está correta: ela agrupa os gastos por hospital, calcula o total de cada um com SUM(g.valor_gasto) e, na cláusula HAVING, compara esse total com a média geral de gastos obtida pela subconsulta SELECT AVG(valor_gasto) FROM gastos. Como o HAVING filtra grupos após a agregação, apenas os hospitais cujo total supera a média geral serão listados — exatamente o que o enunciado pede.

A questão cobra o entendimento da ordem lógica de execução de uma consulta SQL com agrupamento. O GROUP BY nome_hospital agrupa as linhas da tabela gastos (após o JOIN com hospital) por hospital, e o SUM(g.valor_gasto) calcula o total de gastos de cada grupo. A cláusula HAVING é aplicada depois da agregação, permitindo filtrar os grupos com base no resultado da função agregada — no caso, comparando o total de cada hospital com a média geral de todos os gastos.

A subconsulta (SELECT AVG(valor_gasto) FROM gastos) calcula a média aritmética de todos os valores da coluna valor_gasto da tabela gastos, sem qualquer filtro ou agrupamento. Esse valor é um escalar (um único número), que serve como referência para a comparação no HAVING. É importante notar que a média geral é calculada sobre todas as linhas de gastos, não sobre os totais por hospital — o que é exatamente o que se espera ao comparar o gasto total de cada hospital com a média geral de gastos.

Um ponto que pode gerar confusão é a diferença entre WHERE e HAVING. O WHERE filtra linhas antes da agregação, não podendo usar funções agregadas. O HAVING filtra grupos depois da agregação, podendo usar funções como SUM, AVG, COUNT. Nesta consulta, o filtro correto é o HAVING, pois a condição depende do total agregado de cada hospital. Se a condição fosse aplicada no WHERE, o banco tentaria filtrar linhas individuais antes de somar, o que não faz sentido para comparar totais com a média geral.

Outro detalhe: a consulta usa JOIN (que por padrão é INNER JOIN) entre gastos e hospital pela chave id_hospital. Isso garante que apenas gastos com hospital correspondente sejam considerados. O ORDER BY nome_hospital apenas ordena o resultado final por nome, sem afetar a lógica de filtragem. A consulta está sintaticamente correta e semanticamente adequada ao que se propõe.

NÃO CAIA NESSA!

A banca pode tentar confundir o candidato quanto ao uso de WHERE no lugar de HAVING. Lembre-se: WHERE filtra linhas antes da agregação e não pode usar funções agregadas; HAVING filtra grupos após a agregação e é o único lugar onde se pode comparar o resultado de SUM ou AVG com um valor. Nesta questão, a comparação com a média geral só é possível no HAVING.

A ordem lógica de execução de uma consulta SQL é:

Essa sequência explica por que o HAVING enxerga os totais agregados e o WHERE não. O SELECT só é avaliado depois do HAVING, então apelidos criados no SELECT não podem ser usados no HAVING (embora alguns SGBDs permitam, não é padrão).

CERTO — a consulta lista corretamente os nomes dos hospitais com gastos totais superiores à média geral de gastos.

Gabarito: Certo.

Link permanente: /questoes/ce403646