Questão nº 47
Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2024 (nº 47)
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?
- A`SELECT 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;`
- B`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 c.idCliente;`
- C`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.idCliente = i.idConta GROUP BY a.nomeAgencia;`
- D`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;` (alternativa correta)
- E`SELECT 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;`
Resposta comentada
Gabarito Alternativa D
Conceito-chave: Para somar valores agrupados por uma categoria (no caso, agência), você precisa usar a função de agregação SUM() e a cláusula GROUP BY na coluna da categoria. Sem o SUM(), você lista valores individuais, não o total.
- (A) Incorreta: Usa
i.valorInvestidosemSUM(), então retorna uma linha para cada investimento individual, não o total por agência. - (B) Incorreta: Agrupa por
c.idCliente(cliente), não pora.nomeAgencia(agência), quebrando o requisito do relatório. - (C) Incorreta: O
JOINentreContaeInvestimentousac.idCliente = i.idConta, uma condição errada (compara campos de naturezas diferentes), gerando dados incorretos ou vazios. - (D) Correta: Aplica
SUM(i.valorInvestido)para somar todos os valores eGROUP BY a.nomeAgenciapara agregar por agência, com oJOINcorreto entreConta.idContaeInvestimento.idConta. - (E) Incorreta: Igual à (A), falta o
SUM(), então não agrega os valores; apenas lista investimentos individuais.
Armadilha da banca (no distrator A): A alternativa (A) parece correta porque tem o JOIN certo e o GROUP BY certo, mas omite o SUM(). Ela usa i.valorInvestido direto no SELECT, o que faz o MySQL retornar uma linha por investimento, mesmo com o GROUP BY (em muitos modos, isso gera valores arbitrários ou erro). A pegadinha é confundir "listar" com "somar" — o enunciado pede valor total investido, que exige agregação.
Fonte: CESGRANRIO BASA 01/2024 Técnico Científico - Área de Formação: Tecnologia da Informação (Caderno Prova B). Reproduzida para fins de estudo.