1
resposta

[Projeto] Desafio SQL: Corrigindo 7.641 Registros com Preços Inconsistentes

Antes de escrever as consultas, resolvi analisar, investigar e executar.

Entendendo o Desafio

  • Tentei entender o que poderia causar esses erros, mas vi que isso não me ajudaria pois existem milhões de possibilidades.
  • Entendi que aqueles dados eram reais e precisavam ser preservados para futuras análises.
  • Percebi que o nome dos produtos se repetiam porém com IDs diferentes.

Estratégias Avaliadas

  • Deletar os dados: Inviável, pois os dados eram reais e apenas o preço estava inconsistente.
  • Coluna "Erro" (true/false): Essa solução eu juro que repensei e martelei, porém ficaria difícil de gerenciar e manter à longo prazo, como também não me protegeria de futuras inconsistências.
  • Criar tabela de intervalos: Estratégia escolhida!

Análises Realizadas

Total de erros: 7.641 registros

Produto com mais erros:

  • Chocolate: 1.968 erros
  • Bola de Futebol: 1.921 erros
  • Livro de Ficção: 1.844 erros
  • Camisa: 1.768 erros

Tipo de erro:

  • Abaixo do mínimo: 140 registros
  • Acima do máximo: 7.501 registros

Conclusão da Análise

Percebi que a maior quantidade de erros era com produtos acima do valor máximo. Talvez o que pode ter ocasionado isso foi a pessoa que registrou talvez confundiu a coluna de preço, podendo assim ter adicionado o valor unitário vezes x quantidades desse produto. Foram 7.641 registros com erros, isso é 76,41% da tabela de produtos que possui 10.000 registros.

Criando a tabela preco_min_max_produtos eu evito que novos dados entrem com valores inconsistentes e preservo a integridade desses dados.

Implementação

Criação da Tabela:

CREATE TABLE preco_min_max_produtos (
  nome_produto TEXT PRIMARY KEY,
  preco_min REAL NOT NULL,
  preco_max REAL NOT NULL
);

Estratégia: Se preço < mínimo → ajusta pro mínimo. Se preço > máximo → ajusta pro máximo.

Correção com UPDATE:

UPDATE produtos
SET preco = (
    SELECT preco_min
    FROM preco_min_max_produtos
    WHERE preco_min_max_produtos.nome_produto = produtos.nome_produto
)
WHERE EXISTS (
    SELECT 1
    FROM preco_min_max_produtos
    WHERE preco_min_max_produtos.nome_produto = produtos.nome_produto
      AND produtos.preco < preco_min_max_produtos.preco_min
);

Resultado: 0 registros com erro

Desafio Encontrado

Inicialmente pensei em usar FK com id_produto, mas percebi que os produtos se repetiam com IDs diferentes. A regra era por TIPO de produto. Usei nome_produto (TEXT) como chave.

Aprendizados

  • EXISTS em SQL
  • UPDATE com subqueries
  • Integridade de dados
1 resposta

Oi, Bruno! Como vai?

Agradeço por compartilhar sua análise com a comunidade Alura.

O seu raciocínio está correto, ao descartar estratégias menos sustentáveis e optar por uma solução que preserva a integridade dos dados. O uso de uma tabela de referência com intervalo de preços foi uma escolha bem consistente, além de mostrar preocupação com escalabilidade e manutenção futura.

Continue assim!

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura

Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!