1
resposta

Exercicio 09

Na minha primeira prática percebi que se colocar o 100.0 após as divisão o resultado dá tudo 0.0%, então tem que colocar o 100.0 antes da divisão, por quê isso acontece?

with Total_Vendas_Categoria AS (SELECT c.nome_categoria AS Nome_Categoria, COUNT(iv.produto_id) AS Total_Vendas_Categoria
  from itens_venda iv
  JOIN vendas v ON v.id_venda = iv.venda_id
  JOIN produtos p on p.id_produto = iv.produto_id
  JOIN categorias c on c.id_categoria = p.categoria_id
  WHERE strftime('%Y', v.data_venda) = '2022'
  GROUP BY Nome_Categoria
), Total_Vendas AS (SELECT COUNT(iv.produto_id) AS Total_Vendas
  from itens_venda iv
  JOIN vendas v ON v.id_venda = iv.venda_id
  WHERE strftime('%Y', v.data_venda) = '2022'
)
SELECT Nome_Categoria, ROUND(**100.0*Total_Vendas_Categoria/ Total_Vendas**, 2) || '%' AS Porcentagem
FROM Total_Vendas_Categoria, Total_Vendas
GROUP BY Nome_Categoria
;
1 resposta

Olá, Bruno, tudo bem?

Esse comportamento ocorre em muitas linguagens de programação e bancos de dados, a divisão entre dois números inteiros resulta em um número inteiro. Ou seja, se você dividir dois números inteiros, o resultado será arredondado para baixo, com isso, a parte decimal será descartada. Por exemplo, se o resultado for menor que 1, ele pode ser arredondado para 0 se você não multiplicar por 100 antes de arredondar.

Ao multiplicar por 100.0 antes da divisão, você está convertendo implicitamente o cálculo para uma operação de ponto flutuante, o que permite que o resultado da divisão mantenha as casas decimais. Isso ocorre porque o 100.0 é um número de ponto flutuante (float), e ao multiplicá-lo por Total_Vendas_Categoria, o resultado é um float, que mantém a precisão decimal durante a divisão. Abaixo deixo um exemplo:

  • Se Total_Vendas_Categoria for 50 e Total_Vendas for 200, então:
    • 50 / 200 resulta em 0 (divisão inteira).
    • 100.0 * 50 / 200 resulta em 25.0 (divisão de ponto flutuante).

Por isso, para garantir que você sempre obtenha um valor percentual correto, você deve multiplicar por 100 antes da divisão

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado