Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fc150342
Banca
FCC
Órgão
Pref SP
Ano
2025
Cargo
AMCI (CGM SP)
Uma Prefeitura está implantando um Data Warehouse para análise de dados financeiros com foco em receitas e despesas públicas. O modelo multidimensional utilizado possui uma tabela fato principal chamada FatosFinanceiros e três dimensões: Tempo, Categoria e Localidade cujas estruturas são:
Um Auditor necessita fazer uma análise para identificar o valor total das receitas e despesas por ano e por categoria. A consulta deve ser otimizada para o modelo multidimensional cuja melhor prática, considerando o modelo descrito, é
ASELECT t. Ano, l.NomeLocalidade , SUM(f.Valor) AS Total FROM FatosFinanceiros f JOIN Tempo t ON f . IDTempo = t . IDTempo JOIN Localidade 1 ON f . IDLocalidade l . IDLocalidade GROUP BY t . Ano, l . NomeLocalidade ;
BSELECT t . Ano, c . NomeCategoria, SUM(f . Valor) AS Total FROM FatosFinanceiros f JOIN Tempo t ON f . IDTempo = t.IDTempo JOIN Categoria c ON f . I DCategoria = c . I DCategoria GROUP BY t .Ano, c . NomeCategoria;
CSELECT l . NomeLocalidade, c . NomeCategoria, SUM(f. Valor) AS Total FROM FatosFinanceiros f JOIN Localidade 1 ON f . IDLocalidade = l .IDLocalidade JOIN Categoria c ON f . IDCategoria = c . I DCategoria GROUP BY l . NomeLocalidade , c .NomeCategoria;
DSELECT t . Mes , c . NomeCategoria , SUM (f. Valor) AS Total FROM FatosFinanceiros f JOIN Tempo t ON f . IDTempo = t .IDTempo JOIN Categoria e ON f . IDCategoria = c. I DCategoria GROUP BY t . Mes , c . NomeCategoria;
ESELECT c . NomeCategoria , l . NomeLocal idade, SUM(f.Valor) AS Total FROM FatosFinanceiros f J OIN Categoria e ON f.I DCategoria = c . I DCategoria JOIN Localidade l ON f . IDLocalidade = l .IDLocalidade GROUP BY c . NomeCategoria , l . NomeLocalidade;
Revelar gabarito e comentário▾
GabaritoB — SELECT t . Ano, c . NomeCategoria, SUM(f . Valor) AS Total
FROM FatosFinanceiros f
JOIN Tempo t ON f . IDTempo = t.IDTempo
JOIN Categoria c ON f . I DCategoria = c . I DCategoria
GROUP BY t .Ano, c . NomeCategoria;
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 em Data Warehouse: agrupamento por dimensões
Gabarito: letra B. A consulta correta deve agrupar os dados por ano (dimensão Tempo) e por categoria (dimensão Categoria), somando os valores da tabela fato FatosFinanceiros. A alternativa B é a única que atende exatamente a esse requisito, fazendo os JOINs corretos entre a tabela fato e as dimensões Tempo e Categoria, e agrupando por t.Ano e c.NomeCategoria.
A questão cobra o conhecimento de como escrever consultas SQL otimizadas para um modelo multidimensional (esquema estrela). Nesse modelo, a tabela fato (FatosFinanceiros) contém as medidas numéricas (o campo Valor) e chaves estrangeiras para as tabelas de dimensão (Tempo, Categoria, Localidade). Para responder à pergunta do auditor — "valor total das receitas e despesas por ano e por categoria" —, precisamos selecionar os campos descritivos das dimensões relevantes (ano e categoria), somar a medida da tabela fato e agrupar por esses mesmos campos. As dimensões que não participam da análise (Localidade) não devem aparecer na consulta, pois isso quebraria o agrupamento desejado.
O esquema estrela é a modelagem mais comum em Data Warehouses. Ele consiste em uma tabela fato central, que armazena os eventos ou transações do negócio (com medidas numéricas), e tabelas de dimensão ao redor, que contêm os atributos descritivos (como nomes, datas, categorias). A principal vantagem desse modelo é a simplicidade das consultas: para analisar dados por qualquer combinação de dimensões, basta fazer JOINs entre a tabela fato e as dimensões desejadas, sem a necessidade de múltiplas junções complexas como em modelos normalizados. A consulta resultante é eficiente e de fácil compreensão.
Na prática, imagine que a tabela FatosFinanceiros tenha registros de receitas e despesas, cada um com um Valor, um IDTempo (referenciando o ano/mês), um IDCategoria (referenciando a categoria da receita/despesa) e um IDLocalidade (referenciando o município). Para saber o total por ano e por categoria, a consulta deve juntar a tabela fato com as dimensões Tempo e Categoria, e agrupar os resultados por Ano e NomeCategoria. A dimensão Localidade não é necessária para essa análise específica, então não deve ser incluída no GROUP BY nem no SELECT.
A pegadinha da banca está em incluir dimensões que não foram solicitadas no enunciado. O auditor pediu especificamente "por ano e por categoria". As alternativas que incluem Localidade no agrupamento (A, C e E) estão incorretas, pois produzem um resultado mais detalhado do que o solicitado, quebrando a granularidade da análise. A alternativa D também está incorreta, pois agrupa por Mes em vez de Ano, o que não atende ao pedido. A alternativa B é a única que seleciona exatamente as dimensões pedidas e agrupa corretamente.
Guarde o critério decisivo: a consulta deve espelhar exatamente as dimensões pedidas no enunciado, nem mais nem menos. É nesse ponto que as alternativas se dividem.
1Identificar dimensões pedidas
2JOINs com tabela fato
3GROUP BY nas dimensões
4SUM da medida
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Esta alternativa agrupa por Ano e NomeLocalidade, incluindo a dimensão Localidade na análise. O enunciado pede agrupamento por ano e categoria, não por localidade. Ao incluir l.NomeLocalidade no SELECT e no GROUP BY, a consulta retorna o total por ano e por cada localidade, o que é uma granularidade diferente da solicitada. O erro é a inclusão de uma dimensão não pedida, que altera o resultado da análise.
Alternativa B — ✅ Correta ⟵ GABARITO
Esta é a consulta correta. Ela seleciona t.Ano e c.NomeCategoria, faz os JOINs entre a tabela fato FatosFinanceiros e as dimensões Tempo e Categoria (usando as chaves estrangeiras IDTempo e IDCategoria), e agrupa por t.Ano e c.NomeCategoria. Isso atende exatamente ao pedido do auditor: o valor total das receitas e despesas por ano e por categoria. A soma é feita com SUM(f.Valor), que agrega os valores da tabela fato para cada combinação de ano e categoria.
Alternativa C — ❌ Incorreta
Esta alternativa agrupa por NomeLocalidade e NomeCategoria, omitindo a dimensão Tempo. O enunciado pede agrupamento por ano e categoria, não por localidade e categoria. A consulta não inclui a dimensão Tempo, então não é possível obter o total por ano. O erro é a substituição da dimensão Tempo pela dimensão Localidade, que não foi solicitada.
Alternativa D — ❌ Incorreta
Esta alternativa agrupa por Mes e NomeCategoria. O enunciado pede agrupamento por ano, não por mês. A dimensão Tempo pode ter vários níveis de granularidade (ano, mês, dia), e a consulta deve usar o nível solicitado. Ao agrupar por t.Mes, o resultado é mais detalhado do que o pedido, mostrando o total por mês e categoria, em vez de por ano e categoria. O erro é o uso do nível errado da dimensão Tempo.
Alternativa E — ❌ Incorreta
Esta alternativa agrupa por NomeCategoria e NomeLocalidade, omitindo a dimensão Tempo e incluindo a dimensão Localidade. O enunciado pede agrupamento por ano e categoria. A consulta não inclui a dimensão Tempo, então não é possível obter o total por ano. O erro é a combinação de dimensões incorreta: inclui Localidade (não pedida) e exclui Tempo (pedida).