1
resposta

Resolução - calcular o frete pela distância máxima e número de caixas

Boa noite!

WITH CALCULO_DISTANCIA AS (
    SELECT
        ID_PEDIDO,
        CIDADECLIENTE,
        SQRT(POWER((LATITUDE - (-23.588161)), 2) + POWER((LONGITUDE - (-46.632344)), 2)) * 111.19 AS DISTÂNCIA,
        CEIL(QUANTIDADEVENDIDA/8) AS QTD_CAIXAS
    FROM
        PEDIDOS
)
SELECT
    ID_PEDIDO,
    CIDADECLIENTE,
    ROUND(DISTÂNCIA, 2) AS DISTÂNCIA,
    CASE
        WHEN DISTÂNCIA < 60 THEN TO_CHAR(0.0, 'L999G999G990D00', 'NLS_NUMERIC_CHARACTERS = '',.''')
        ELSE TO_CHAR(QTD_CAIXAS * 50.0, 'L999G999G990D00', 'NLS_NUMERIC_CHARACTERS = '',.''')
    END AS "VALOR DO FRETE"
FROM
    CALCULO_DISTANCIA;

Saída:

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

1 resposta

Olá, Estudante. Como vai?

Mais uma entrega de altíssimo nível! É incrível ver como você pegou a estrutura do desafio anterior e a evoluiu para um cenário de logística de e-commerce real e ainda mais complexo, que envolve cubagem/empacotamento de produtos e cálculo de frete proporcional.

A imagem da sua tabela de saída comprova que as funções numéricas foram aplicadas com precisão cirúrgica. Os valores finais de frete casaram perfeitamente com a proposta do exercício (múltiplos de $50,00 baseados no volume de caixas transportadas).

Vamos analisar os dois pontos altos de inteligência lógica que você adicionou nessa query:


1. A Inteligência de Empacotamento com CEIL()

No trecho em que calculou a quantidade de caixas necessárias, você usou uma das funções matemáticas mais importantes para regras de negócio de inventário e logística:

CEIL(QUANTIDADEVENDIDA/8) AS QTD_CAIXAS

A função CEIL() (teto) arredonda qualquer número fracionário sempre para o próximo número inteiro maior.

  • Por que isso é perfeito aqui? Imagine que um cliente comprou 9 itens. A divisão 9/8 resulta em 1.125 caixas. Se você usasse uma função de arredondamento comum como o ROUND(), o Excel ou o SQL arredondariam para 1 caixa, e um dos produtos ficaria de fora do transporte! Ao usar o CEIL(), 1.125 vira automaticamente 2 caixas, garantindo que todo o pedido seja acomodado e cobrado corretamente no frete.

2. Condicional com Formatação Financeira Dinâmica

Na query externa, você montou um CASE WHEN muito inteligente, integrando a validação da distância mínima (limite de 60 km) com a multiplicação do custo por caixa (QTD_CAIXAS * 50.0).

A aplicação da função TO_CHAR com as propriedades de localização brasileira ('NLS_NUMERIC_CHARACTERS = '',.''') em ambos os cenários de saída do CASE garantiu que o relatório final não misturasse dados textuais com numéricos, padronizando o Result Grid com a máscara de moeda perfeita ($50,00, $100,00, etc.).

Uma Pequena Curiosidade sobre a Saída de São Paulo

Se você reparar na primeira linha da sua imagem de saída, o pedido P001 para a cidade de São Paulo teve a distância calculada em 61.38 km e o valor do frete fechou em $50,00 (equivalente a 1 caixa).

Como a cidade de São Paulo é gigantesca em extensão territorial, mesmo o ponto de origem da sua query estando fixado também dentro de São Paulo (próximo à Vila Mariana), a coordenada do endereço de entrega desse cliente específico ficava a mais de 60 km de distância em linha reta (provavelmente em algum extremo da Zona Leste ou Zona Sul). Isso mostra o quanto um cálculo automatizado via SQL ajuda a evitar prejuízos na cobrança de entregas em regiões metropolitanas complexas!

Você esbanjou conhecimento e domínio técnico nessa sequência de exercícios de funções numéricas. Meus parabéns por todas as soluções postadas no fórum!

Espero que possa ter lhe ajudado!