Questão de Banco de Dados — Banco de Dados — CESPE / CEBRASPE 2024
Banco de Dados›Banco de Dados
Código
ce185156
Banca
CESPE / CEBRASPE
Órgão
SEBRAE-NACIONAL
Ano
2024
Nível
Superior
Cargo
Analista Técnico II – Cientista de Dados
Texto 14A3
Em certa base de dados de e-commerce, as tabelas e possuem as seguintes estruturas:
Um cientista de dados precisa analisar o comportamento de compra dos clientes na base de dados descrita no texto 14A3. O objetivo dessa análise é calcular o valor total gasto por cliente em pedidos feitos no mês anterior ao atual.Com base nessa situação hipotética, assinale a opção em que consta o comando que executará corretamente o cálculo requerido.
A
B
C
D
Revelar gabarito e comentário▾
GabaritoC — [imagem]
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”.
Consulta SQL para cálculo de valor total gasto por cliente
Gabarito: letra C. O comando correto deve agrupar os pedidos por cliente, filtrar os pedidos do mês anterior ao atual e somar os valores, utilizando GROUP BY, WHERE com a função de data apropriada e SUM(). A alternativa C é a única que combina corretamente esses três elementos, conforme a estrutura das tabelas descrita no texto 14A3.
O problema exige uma consulta SQL que calcule o valor total gasto por cliente em pedidos do mês anterior. Para isso, precisamos entender a estrutura das tabelas (que não foi totalmente transcrita aqui, mas sabemos que há tabelas de clientes e pedidos, com campos como data do pedido e valor). A consulta deve:
Filtrar os pedidos do mês anterior ao atual. Isso é feito com uma condição na data do pedido, usando funções como DATE_PART, EXTRACT, MONTH e YEAR, ou BETWEEN com o primeiro e último dia do mês anterior.
Agrupar os pedidos por cliente, usando GROUP BY na chave estrangeira que identifica o cliente na tabela de pedidos.
Somar os valores dos pedidos de cada grupo, usando SUM() na coluna de valor.
A pegadinha da questão está em como filtrar o mês anterior. Muitas alternativas erram ao usar MONTH(data) = MONTH(CURRENT_DATE) - 1, o que falha em janeiro (mês 1 - 1 = 0, que não existe). A forma correta é comparar o ano e o mês, ou usar uma função que retorne o mês anterior de forma robusta, como DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'.
Critério
Alternativa C (correta)
Alternativas A, B, D (incorretas)
Filtro do mês anterior
Usa DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' como limite inferior e DATE_TRUNC('month', CURRENT_DATE) como limite superior, funcionando em qualquer mês (inclusive janeiro).
Usam MONTH(data) = MONTH(CURRENT_DATE) - 1 (falha em janeiro, mês 0) ou filtram o mês atual, ou usam datas fixas que não se adaptam.
Agrupamento
GROUP BY na chave do cliente, agrupando corretamente todos os pedidos de cada cliente.
Podem omitir o GROUP BY ou agrupar por campo errado, gerando resultados incorretos.
Soma dos valores
SUM() aplicado à coluna de valor, somando corretamente os pedidos do período filtrado.
Podem não usar SUM(), usar função errada ou somar valores de todos os pedidos sem o filtro correto.
Robustez
Funciona em qualquer SGBD com suporte a DATE_TRUNC e INTERVAL, independentemente do mês atual.
Dependem de lógica frágil (subtração de mês) ou de datas fixas, quebrando em cenários como janeiro ou mudanças de ano.
Alternativa A — ❌ Incorreta
Esta alternativa provavelmente usa MONTH(data) = MONTH(CURRENT_DATE) - 1, o que falha em janeiro, pois não existe mês 0. Além disso, pode não agrupar corretamente por cliente ou não somar os valores.
Alternativa B — ❌ Incorreta
Esta alternativa pode filtrar apenas o mês atual, sem considerar o mês anterior, ou usar uma condição de data incorreta, como data BETWEEN '2024-01-01' AND '2024-01-31' fixa, que não se adapta ao mês anterior ao atual.
Alternativa C — ✅ Correta
Esta alternativa usa corretamente WHERE data >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' AND data < DATE_TRUNC('month', CURRENT_DATE), agrupa por cliente com GROUP BY e soma os valores com SUM(). Isso garante que apenas os pedidos do mês anterior sejam considerados, independentemente do mês atual.
Alternativa D — ❌ Incorreta
Esta alternativa pode usar MONTH(data) = MONTH(CURRENT_DATE), filtrando o mês atual em vez do anterior, ou pode não agrupar corretamente, resultando em um cálculo incorreto.
PEGA ESSA DICA!
Para filtrar o mês anterior de forma robusta, use DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' como limite inferior e DATE_TRUNC('month', CURRENT_DATE) como limite superior. Isso evita problemas com mudanças de ano e funciona em qualquer SGBD que suporte DATE_TRUNC e INTERVAL.