Questão de Banco de Dados — Consultas e Comandos em SQL — CESGRANRIO 2024
Banco de Dados›Consultas 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?
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;
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;
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;
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;
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: Agencia → Conta → Investimento. 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.
1JOIN Agencia→Conta (idAgencia)
2JOIN Conta→Investimento (idConta)
3SUM(valorInvestido)
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.