Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025

Banco de DadosConsultas e Comandos em SQL
Código
fc150339
Banca
FCC
Órgão
Pref SP
Ano
2025
Cargo
Ana ( )

Para atender aos requisitos de um departamento municipal de produtos agrícolas sobre a movimentação temporal entre locais dos produtos estocados, uma Analista criou e populou as seguintes tabelas Fato e Dimensões usando o modelo snowflake:


Tabela Fato:
CREATE TABLE FatoEstoque (
  id INT PRIMARY KEY,
  data DATE,
  local_id INT,
  produto_id INT,
  volume lNT
);

 

Tabelas Dimensões:
CREATE TABLE DimLocal (
   local_id INT PRIMARY KEY,
   nome_ local VARCHAR(100),
   endereco VARCHAR(255)
);
CREATE TABLE DimProduto (
  produto_ id INT PRIMARY KEY,
  nome_produto VARCHAR(100),
  categoria VARCHAR(100)
);
CREATE TABLE DimData (
   data DATE PRIMARY KEY,
   ano INT,
   mes INT,
   dia INT
);


A seguir, ela escreveu corretamente a seguinte consulta SQL, que somou os produtos estocados em cada local para os anos de 2023 e 2024 e ordenou os resultados do local mais movimentado para o menos movimentado:

  1. ASELECT l. nome_ local, SUM ( f . volume) AS total_ volume FROM FatoEstoque f JOIN DimLocal l LIKE f . local id = l . local id JOIN DimData d LIKE f . dat a = d .data WHERE d . ano SUM (2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;
  2. BSELECT l. nome_ local, ON(f.volume) AS total_ volume FROM FatoEstoque f JOIN DimLocal l ON f . local id = l. local id JOIN DimData d ON f .data = d .data WHERE d . ano MAX(2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;
  3. CSELECT l. nome_ local, FOR ( f . volume) AS total volume FROM FatoEstoque f JOIN DimLocal l WITH f . local id = l. local id JOIN DimData d WITH f . data = d .data WHERE d . ano IN (2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;
  4. DSELECT l. nome_ local, SUM (f . volume) AT total volume FROM FatoEstoque f JOIN DimLocal l IN f . local- id = l . local-id JOIN DimData d IN f . data = d . data WHERE d . ano SUM(2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;
  5. ESELECT l. nome_ local, SUM ( f . volume) AS total volume FROM FatoEstoque f JOIN DimLocal l ON f . local id = l. local id JOIN DimData d ON f .data = d .data WHERE d . ano IN (2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;
Revelar gabarito e comentário

GabaritoE — SELECT l. nome_ local, SUM ( f . volume) AS total volume FROM FatoEstoque f JOIN DimLocal l ON f . local id = l. local id JOIN DimData d ON f .data = d .data WHERE d . ano IN (2023, 2024) GROUP BY l . nome local ORDER BY total_volume DESC;

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 ORDER BY

Gabarito: letra E. A consulta correta usa SUM(f.volume) para somar os volumes, JOIN ... ON para relacionar as tabelas, WHERE d.ano IN (2023, 2024) para filtrar os anos, GROUP BY l.nome_local para agrupar por local e ORDER BY total_volume DESC para ordenar do mais movimentado para o menos movimentado. As demais alternativas contêm erros de sintaxe ou de uso de funções/cláusulas.

A questão exige o conhecimento da sintaxe correta de uma consulta SQL que envolve agregação (SUM), junção de tabelas (JOIN), filtro (WHERE), agrupamento (GROUP BY) e ordenação (ORDER BY). Vamos analisar cada parte da consulta correta:

  • SELECT l.nome_local, SUM(f.volume) AS total_volume: seleciona o nome do local e a soma dos volumes, dando um apelido (AS) à coluna calculada. O SUM é uma função de agregação que soma os valores de uma coluna.

  • FROM FatoEstoque f JOIN DimLocal l ON f.local_id = l.local_id JOIN DimData d ON f.data = d.data: realiza a junção entre a tabela fato e as dimensões. A cláusula JOIN é usada para combinar linhas de duas ou mais tabelas com base em uma condição de correspondência, especificada após ON. Aqui, a condição é a igualdade entre as chaves estrangeiras na tabela fato e as chaves primárias nas dimensões.

  • WHERE d.ano IN (2023, 2024): filtra os registros para incluir apenas os anos de 2023 e 2024. O operador IN verifica se um valor está contido em uma lista de valores.

  • GROUP BY l.nome_local: agrupa as linhas resultantes pelo nome do local, para que a função SUM seja aplicada a cada grupo separadamente.

  • ORDER BY total_volume DESC: ordena o resultado final pela coluna total_volume em ordem decrescente (DESC), ou seja, do maior para o menor volume, atendendo ao requisito de "local mais movimentado para o menos movimentado".

A banca explora erros comuns de sintaxe e de uso incorreto de cláusulas e funções. Vamos ver cada alternativa:

  1. 1SELECT + SUM + AS
  2. 2FROM + JOIN ... ON
  3. 3WHERE ... IN
  4. 4GROUP BY
  5. 5ORDER BY ... DESC
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O erro está no uso de LIKE em vez de ON nas cláusulas JOIN. A sintaxe correta é JOIN DimLocal l ON f.local_id = l.local_id, e não JOIN DimLocal l LIKE f.local_id = l.local_id. Além disso, WHERE d.ano SUM(2023, 2024) é inválido: SUM é uma função de agregação, não um operador de comparação. O correto seria WHERE d.ano IN (2023, 2024).

Alternativa B — ❌ Incorreta

O erro está em ON(f.volume) AS total_volume: ON é usado para especificar a condição de junção, não para criar um alias. O correto seria SUM(f.volume) AS total_volume. Além disso, WHERE d.ano MAX(2023, 2024) é inválido: MAX é uma função de agregação, não um operador de comparação. O correto seria WHERE d.ano IN (2023, 2024).

Alternativa C — ❌ Incorreta

O erro está no uso de WITH em vez de ON nas cláusulas JOIN. A sintaxe correta é JOIN DimLocal l ON f.local_id = l.local_id, e não JOIN DimLocal l WITH f.local_id = l.local_id. Além disso, FOR (f.volume) é inválido: FOR não é uma função de agregação. O correto seria SUM(f.volume).

Alternativa D — ❌ Incorreta

O erro está no uso de AT em vez de AS para o alias: SUM(f.volume) AT total_volume deveria ser SUM(f.volume) AS total_volume. Além disso, JOIN DimLocal l IN f.local_id = l.local_id usa IN em vez de ON, e WHERE d.ano SUM(2023, 2024) é inválido, como já explicado.

Alternativa E — ✅ Correta ⟵ GABARITO

Esta alternativa apresenta a sintaxe correta em todos os pontos: SUM(f.volume) AS total_volume, JOIN ... ON para as duas junções, WHERE d.ano IN (2023, 2024), GROUP BY l.nome_local e ORDER BY total_volume DESC. É exatamente a consulta que atende ao requisito do enunciado.

NÃO CAIA NESSA!

A banca troca ON por LIKE, WITH ou IN nas junções, e usa SUM/MAX como se fossem operadores de comparação no WHERE. Esses são erros clássicos de sintaxe SQL. Fique atento: ON é a palavra-chave para condição de junção, e IN é o operador para listas de valores.

PEGA ESSA DICA!

Para resolver questões de SQL, verifique cada cláusula separadamente: SELECT (funções de agregação e aliases), FROM/JOIN (condições com ON), WHERE (filtros com operadores corretos), GROUP BY (colunas de agrupamento) e ORDER BY (ordenação). Se uma alternativa tiver erro em qualquer uma dessas partes, ela está incorreta.

Gabarito: letra E

Link permanente: /questoes/fc150339