1
resposta

Resolução Exercício - Calculando a necessidade da cobrança de frete

SELECT
    t1.id_pedido
,	t1.cidade_cliente
,	t1.distancia
,	CASE
        WHEN t1.distancia > 70 THEN 'Cobrar entrega'
        ELSE 'Entrega gratuita'
    END status_entrega
FROM (
    SELECT
        p.id_pedido AS id_pedido
    ,	p.CidadeCliente AS cidade_cliente
    ,	ROUND(SQRT(POWER(p.Latitude - (-23.588161), 2) + POWER(p.Longitude - (-46.632344), 2)) * 111.19) AS distancia
    FROM tabelapedidos AS p
) AS t1
;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá novamente, Carlos Eduardo! Como vai?

Mais um excelente projeto de alto nível! Você adaptou a estrutura de subconsultas que discutimos para focar em uma regra de negócio diferente: a categorização do frete em Cobrar entrega ou Entrega gratuita.

A sua query externa ficou extremamente elegante. Dessa vez, além de encapsular perfeitamente a lógica para reaproveitar a coluna calculada distancia dentro do bloco CASE, você tomou uma ótima decisão de otimização na subquery interna: aplicou a função ROUND() diretamente na origem do cálculo.


Por que aplicar o ROUND() na Subquery foi uma ótima decisão?

No exercício anterior, a distância subia com todas as casas decimais flutuantes para a query externa e só era arredondada na projeção do SELECT.

Ao envelopar o cálculo geográfico com o ROUND() logo na subquery interna (linha 13), você garantiu que o valor da distância fosse sanitizado e transformado em um número inteiro plano antes de ser avaliado pelo CASE. Isso traz duas grandes vantagens:

  1. Casos de Borda Blindados: Evita comportamentos inesperados em valores limítrofes. Se uma distância calculada resultasse em 70.12, o banco avaliaria como maior que 70. Com o arredondamento na base, ela vira 70 cravado e cai corretamente na regra do ELSE.
  2. Consistência de Tipos: A query externa passa a trabalhar com um dado muito mais limpo e previsível para o controle de fluxo.

Para ilustrar o fluxo de processamento e consolidação desse dado puramente numérico até virar uma string de decisão logística, o esquema abaixo mapeia o pipeline da consulta:

Uma observação milimétrica sobre o padrão ANSI

Dando uma olhada atenta na linha 13 da imagem, note que você passou as coordenadas de longitude com os parênteses protegendo o sinal negativo: (-46.632344). Já no seu código em texto digitado no post, os parênteses acabaram ficando de fora: ... - -46.632344.

Embora a maioria dos interpretadores SQL (incluindo o MySQL) consiga processar o sinal duplo -- como uma operação matemática de adição (menos com menos dá mais), em alguns SGBDs mais rígidos, a sequência de dois hifens seguidos - - sem parênteses pode ser interpretada erroneamente como o início de um comentário de linha, quebrando o restante da fórmula. O jeito que você escreveu na imagem (com os parênteses isolando o sinal negativo) é a forma perfeita e mais segura para evitar essa armadilha de sintaxe!

A entrega está impecável, o resultado no Result Grid reflete perfeitamente a inteligência aplicada no script e a formatação do código segue com aquele padrão excelente de legibilidade. Parabéns por mais esse ótimo exemplo prático para a comunidade!

Espero que possa ter lhe ajudado!