Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESGRANRIO 2024

Banco de DadosConsultas e Comandos em SQL
Código
cg057874
Banca
CESGRANRIO
Órgão
BASA
Ano
2024
Cargo
Tec Cien ( )
Um gerente executivo de um grande banco deseja estudar o investimento feito pelos clientes pessoas físicas, considerando o valor investido em reais, com detalhamento por tipo de investimento e agência. Para isso, encomendou um painel OLAP, no qual a tela inicial deve ser o valor, em reais, da soma do investimento de todos os clientes de cada agência, listados por agência, agregando todos os tipos de investimento, na forma de um relatório em tela com duas colunas: Nome da Agência e Valor Total Investido.   Considere que as seguintes visões estão disponíveis:   Agencia(idAgencia,nomeAgencia) Cliente(idCliente,nomeCliente) Conta(idCliente,idAgencia,idConta) TipoInvestimento(idTipoInvestimento,nomeInvestimento) Investimento(idConta,idTipoInvestimento,valorInvestido)   Nesse contexto, considerando-se o uso do banco de dados MySQL, que consulta SQL fornece corretamente os dados para a tela inicial desejada?
  1. ASELECT a.nomeAgencia AS Agencia, i.valorInvestido AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idConta = i.idConta GROUP BY a.nomeAgencia;
  2. BSELECT a.nomeAgencia AS Agencia, SUM(i.valorInvestido) AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idConta = i.idConta GROUP BY c.idCliente;
  3. CSELECT a.nomeAgencia AS Agencia, SUM(i.valorInvestido) AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idCliente = i.idConta GROUP BY a.nomeAgencia;
  4. DSELECT a.nomeAgencia AS Agencia, SUM(i.valorInvestido) AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idConta = i.idConta GROUP BY a.nomeAgencia;
  5. ESELECT a.nomeAgencia AS Agencia, i.valorInvestido AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idConta = i.idConta GROUP BY a.nomeAgencia;
Revelar gabarito e comentário

GabaritoD — SELECT a.nomeAgencia AS Agencia, SUM(i.valorInvestido) AS ValorTotalInvestido FROM Agencia a JOIN Conta c ON a.idAgencia = c.idAgencia JOIN Investimento i ON c.idConta = i.idConta GROUP BY a.nomeAgencia;

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”.

Consultas SQL com Agregação e Agrupamento

Gabarito: letra D. A consulta correta deve somar os valores investidos (SUM(i.valorInvestido)) e agrupar o resultado por agência (GROUP BY a.nomeAgencia), unindo as tabelas Agencia, Conta e Investimento pelos relacionamentos corretos (a.idAgencia = c.idAgencia e c.idConta = i.idConta). As demais alternativas falham por omitir a função de agregação, agrupar pela coluna errada ou usar uma condição de junção incorreta.

A questão pede um relatório que mostre, para cada agência, o valor total investido por todos os clientes, independentemente do tipo de investimento. Isso exige três operações fundamentais do SQL: junção (JOIN) para combinar as tabelas relacionadas, agregação (SUM) para totalizar os valores e agrupamento (GROUP BY) para separar os totais por agência.

Vamos entender o modelo de dados. Temos as tabelas Agencia, Cliente, Conta, TipoInvestimento e Investimento. A tabela Conta relaciona um cliente a uma agência (idCliente, idAgencia). A tabela Investimento relaciona uma conta a um tipo de investimento, com o valor investido (idConta, idTipoInvestimento, valorInvestido). Para chegar ao valor investido por agência, precisamos percorrer o caminho: AgenciaContaInvestimento. Isso é feito com dois JOINs: um entre Agencia e Conta pela chave idAgencia, e outro entre Conta e Investimento pela chave idConta.

A função de agregação SUM é essencial: sem ela, a consulta retornaria uma linha para cada investimento individual, não o total por agência. O GROUP BY a.nomeAgencia agrupa as linhas resultantes da junção por agência, permitindo que o SUM calcule o total para cada grupo. A cláusula GROUP BY deve listar exatamente a coluna não agregada do SELECT (no caso, a.nomeAgencia), pois o SQL exige que toda coluna no SELECT que não esteja dentro de uma função de agregação apareça no GROUP BY.

A pegadinha da banca está em três pontos: (1) omitir o SUM, o que quebra a agregação; (2) agrupar por uma coluna que não está no SELECT (como c.idCliente), o que geraria um erro ou um resultado incorreto; e (3) usar uma condição de junção errada (c.idCliente = i.idConta), que não faz sentido no modelo. A alternativa correta é a única que combina todos os elementos certos.

  1. 1JOIN Agencia→Conta (idAgencia)
  2. 2JOIN Conta→Investimento (idConta)
  3. 3SUM(valorInvestido)
  4. 4GROUP BY nomeAgencia
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Falta a função de agregação SUM. O SELECT traz i.valorInvestido diretamente, sem somar. Com GROUP BY a.nomeAgencia, o SQL retornaria uma linha por agência, mas com apenas um dos valores investidos (arbitrário), não o total. Para obter o total, é obrigatório usar SUM(i.valorInvestido).

Alternativa B — ❌ Incorreta

O GROUP BY c.idCliente está errado. A consulta seleciona a.nomeAgencia e SUM(i.valorInvestido), mas agrupa por c.idCliente, que não aparece no SELECT. Isso viola a regra do SQL de que toda coluna não agregada no SELECT deve estar no GROUP BY. Além disso, o agrupamento por cliente não atende ao requisito de listar por agência — o relatório ficaria com uma linha por cliente, não por agência.

Alternativa C — ❌ Incorreta

A condição de junção c.idCliente = i.idConta está incorreta. A tabela Investimento se relaciona com Conta pela chave idConta, não por idCliente. Essa junção não faz sentido no modelo e produziria um produto cartesiano ou resultados sem correspondência, gerando dados incorretos ou ausentes.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta é a consulta correta. Ela une Agencia com Conta por a.idAgencia = c.idAgencia e Conta com Investimento por c.idConta = i.idConta, soma os valores com SUM(i.valorInvestido) e agrupa por a.nomeAgencia. O resultado é exatamente o desejado: uma linha por agência com o valor total investido.

Alternativa E — ❌ Incorreta

Assim como a alternativa A, falta a função de agregação SUM. O SELECT traz i.valorInvestido sem somar, e o GROUP BY a.nomeAgencia faria o SQL retornar apenas um valor arbitrário por agência, não o total. A agregação é indispensável para o relatório.

A regra de ouro para questões de agregação: sempre que o relatório pedir um total, média, contagem etc., por algum agrupamento, o SELECT deve usar a função de agregação correspondente (SUM, AVG, COUNT) e o GROUP BY deve conter exatamente as colunas não agregadas do SELECT. Junções devem usar as chaves estrangeiras corretas do modelo.

Gabarito: letra D

Link permanente: /questoes/cg057874