FC ConcursosFC Concursos

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.

  1. 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
  2. select avg(e2.valor) from tb_emprestimo e2 group by e2.ano
  3. 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
  4. 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
  5. 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

Continue aprendendo