Questão FC369490
Seja um banco de dados relacional especificado em SQL de uma empresa de correspondência entre clientes, instituições financeiras e empréstimos contratados por esses clientes nessas
Linguagem SQL
FGV · 2024
Seja um banco de dados relacional especificado em SQL de uma empresa de correspondência entre clientes, instituições financeiras e empréstimos contratados por esses clientes nessas instituições, previamente implementado em um banco de dados como a seguir:
create table tb_cliente
(
id_cliente integer primary key,
num_cpf char(11) unique,
nome varchar(50) not null,
email varchar(20),
telefone varchar(20),
endereco varchar(100),
cidade varchar(20),
estado char(2)
);
create table tb_financeira
(
id_financeira integer primary key,
razao_social varchar(30) not null,
cidade varchar(30) not null,
estado char(2) not null
);
create table tb_emprestimo
(
id_financeira integer references tb_financeira,
id_cliente integer references tb_cliente,
valor real not null check(valor > 0),
dia integer not null check(dia >= 1 and dia <= 31),
mes integer not null check(mes >= 1 and mes <= 12),
ano integer not null check(ano >= 1980 and ano <= 2100),
primary key(id_financeira, id_cliente, dia, mes, ano)
);
OBS: Neste banco de dados, cadeias de caracteres (strings) são representadas envoltas em aspas simples.
Com vistas à detecção de movimentações atípicas, um auditor desenvolveu uma consulta que identificasse médias de empréstimos em meses de 2024 que fossem destoantes do comportamento da média de empréstimos desse mesmo ano.
Para isso, ele desenvolveu a consulta a seguir, que necessita ser complementada:
select f.id_financeira, c.id_cliente, e.mes, avg(e.valor) from tb_cliente c natural join tb_emprestimo e
natural join tb_financeira f
where e.ano = 2024
group by f.id_financeira, c.id_cliente, e.mes, e.ano
having avg(e.valor) >=
( /* COMPLEMENTAR */ )
A fim de substituir o trecho da consulta, marcado com o comentário /* COMPLEMENTAR */, assinale a subconsulta que corretamente atende ao objetivo almejado pelo auditor.
- select avg(e.valor) from tb_financeira f2 where e.id_cliente = c.id_cliente and f2.id_financeira = f.id_financeira group by f2.id_financeira, e.ano
- select avg(e2.valor) from tb_emprestimo e2 group by e2.ano
- select avg(e2.valor) from tb_emprestimo e2 where e.id_cliente = c.id_cliente and e.id_financeira = f.id_financeira and e.ano = e.ano group by f.id_financeira, e2.ano
- select avg(e2.valor) from tb_emprestimo e2 where e2.id_cliente = c.id_cliente and e2.id_financeira = f.id_financeira and e2.ano = e.ano group by f.id_financeira, e2.ano
- select avg(e2.valor) from tb_emprestimo where e2.id_cliente = c.id_cliente and e2.id_financeira = f.id_financeira group by f.id_financeira, e2.ano
Mostrar resposta e comentário
Gabarito
D
Comentário do professor
Subconsulta correlacionada: ela calcula a média anual dos valores de empréstimo (avg(e2.valor)) para o mesmo cliente e a mesma financeira, restringindo-se ao mesmo ano do registro externo.
Os vínculos são feitos em WHERE: e2.id_cliente = c.id_cliente, e2.id_financeira = f.id_financeira e e2.ano = e.ano. Assim a subconsulta considera apenas empréstimos daquele cliente naquela financeira no mesmo ano.
O GROUP BY f.id_financeira, e2.ano garante que a subconsulta retorne a média anual correspondente (um único valor) que pode ser comparado no HAVING.
Na prática a condição do HAVING verifica se a média mensal (\( \text{avg\_mês} \)) é maior ou igual à média anual (\( \text{avg\_ano} \)): \( \text{avg\_mês} \ge \text{avg\_ano} \). Isso identifica meses cujas médias destoam para cima em relação ao comportamento anual do mesmo cliente/financeira.
Conteúdo do catálogo FC Concursos · Atualizado em