Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024

Banco de DadosConsultas e Comandos em SQL
Código
ce403659
Banca
CESPE / CEBRASPE
Órgão
SEBRAE
Ano
2024
Cargo
Ana Tec II ( )

Texto 14A3

 

Em certa base de dados de e-commerce, as tabelas pedidos e clientes possuem as seguintes estruturas:


pedidos(pedido_id, cliente_id, data_pedido, e
valor_pedido)
clientes(cliente_id, nome_cliente, email,
cidade)

 

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.

  1. ASELECT nome, valor_total FROM clientes WHERE data_pedido > CURRENT_DATE - INTERVAL '1 month';
  2. BSELECT nome, SUM(valor_total) AS total_gasto FROM clients LEFT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id GROUP BY nome;
  3. CSELECT nome, SUM(valor_pedido) AS total_ pedido FROM clientes INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id WHERE data_pedido > CURRENT_DATE - INTERVAL '1 month' GROUP BY nome;
  4. DSELECT nome, valor_ pedido FROM clientes INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id WHERE data_pedido > CURRENT_DATE - INTERVAL '1 month';
Revelar gabarito e comentário

GabaritoC — SELECT nome, SUM(valor_pedido) AS total_ pedido FROM clientes INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id WHERE data_pedido > CURRENT_DATE - INTERVAL '1 month' GROUP BY nome;

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

SQL – Consulta com JOIN, GROUP BY e SUM

Gabarito: letra C. O comando correto deve unir as tabelas clientes e pedidos pela chave cliente_id, filtrar os pedidos do mês anterior ao atual e somar o valor_pedido agrupado por cliente. A alternativa C é a única que combina todos esses elementos: INNER JOIN, WHERE com a condição de data e GROUP BY nome.

Para calcular o valor total gasto por cliente em pedidos do mês anterior, precisamos de três operações fundamentais do SQL: junção (JOIN), filtro (WHERE) e agregação (SUM com GROUP BY). Vamos entender cada uma.

1. A junção (JOIN): Como os dados estão distribuídos em duas tabelas (clientes e pedidos), precisamos combiná-las. O INNER JOIN retorna apenas os registros que têm correspondência em ambas as tabelas — ou seja, clientes que possuem pedidos. Isso é exatamente o que queremos, pois clientes sem pedidos não teriam valor a somar. A condição de junção é clientes.cliente_id = pedidos.cliente_id.

2. O filtro (WHERE): O enunciado pede pedidos do "mês anterior ao atual". A expressão data_pedido > CURRENT_DATE - INTERVAL '1 month' filtra pedidos feitos nos últimos 30 dias. Embora não seja uma definição exata de "mês anterior" (que seria o mês calendário completo), é a condição que a banca considera correta. O importante é que o filtro é aplicado antes do agrupamento, o que é feito corretamente na alternativa C.

3. A agregação (SUM com GROUP BY): Para obter o total por cliente, usamos SUM(valor_pedido) e agrupamos por nome com GROUP BY nome. A regra do SQL é que toda coluna não agregada no SELECT deve aparecer no GROUP BY. Como nome é a coluna de agrupamento, ela aparece no SELECT e no GROUP BY.

A ordem lógica de execução de uma consulta SQL é: FROMJOINWHEREGROUP BYSELECT. Isso significa que o filtro do WHERE é aplicado antes do agrupamento, o que é essencial para que a soma considere apenas os pedidos do período desejado.

A pegadinha desta questão está em duas frentes: (1) esquecer a agregação (SUM + GROUP BY), retornando uma linha por pedido em vez de um total por cliente; e (2) usar LEFT JOIN em vez de INNER JOIN, o que incluiria clientes sem pedidos (com valor NULL). A alternativa C resolve ambas corretamente.

  1. 1FROM + JOIN
  2. 2WHERE (filtro)
  3. 3GROUP BY
  4. 4SELECT (SUM)
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Esta alternativa não faz a junção entre as tabelas. Ela seleciona nome e valor_total apenas da tabela clientes, mas valor_total não existe nessa tabela (o campo correto é valor_pedido na tabela pedidos). Além disso, a condição WHERE data_pedido > ... referencia uma coluna que não está na tabela clientes. O comando está sintaticamente e semanticamente incorreto.

Alternativa B — ❌ Incorreta

Esta alternativa usa LEFT JOIN, que retorna todos os clientes, inclusive aqueles sem pedidos. Para esses clientes, o SUM(valor_pedido) resultaria em NULL, o que não representa o total gasto. Além disso, há um erro de digitação: a tabela é clientes, não clients. O LEFT JOIN é inadequado aqui porque queremos apenas clientes que fizeram pedidos.

Alternativa C — ✅ Correta ⟵ GABARITO

Esta é a alternativa correta. Ela faz o INNER JOIN entre clientes e pedidos pela chave cliente_id, filtra os pedidos do período com WHERE data_pedido > CURRENT_DATE - INTERVAL '1 month', e agrupa por nome com SUM(valor_pedido). A ordem das cláusulas está correta: FROMINNER JOINWHEREGROUP BYSELECT. O INNER JOIN garante que apenas clientes com pedidos sejam considerados, e o GROUP BY nome agrega o total por cliente.

Alternativa D — ❌ Incorreta

Esta alternativa faz o INNER JOIN e o filtro corretamente, mas não agrega os dados. Ela seleciona nome e valor_pedido diretamente, retornando uma linha para cada pedido individual, não o total por cliente. Falta a função SUM e a cláusula GROUP BY, que são essenciais para o cálculo solicitado.

Gabarito: letra C

Link permanente: /questoes/ce403659