Ir para conteúdo
  • 0

sql para encontrar a variação percentual


Mizael Silva

Pergunta

  • Membros
Pessoal, Boa tarde! Alguém consegui me ajudar com esse caso Estou com o seguinte problema preciso comparar se houve variação de preço do produto para mais ou para menos dentro de um período e o percentual dessa variação, então usei um min e max para encontrar a menor e a maior data do período, também usei a mesma logica para o preço, o problema é que na logica q usei o menor valor esta sempre vinculado a menor data mas da pratica isso pode variar, por exemplo a última data de compra pode vir com um preço menor que da primeira compra, preciso de uma ajuda solucionar.

select p.pro_codg_mestre"Cod", p.pro_descricao"Descrição", min (i.mov_preco_unitario) "Valor Unitario_Min", min (trunc (i.mov_dta_movimento)) "DataMin", max (i.mov_preco_unitario) "Valor Unitario_Max", max (trunc (i.mov_dta_movimento)) "Data_Max", round((((max(i.mov_preco_unitario) - min(i.mov_preco_unitario))*100)/ min(i.mov_preco_unitario)),2)"Aumento Perc.%" from itens_nota i, produto p where p.pro_codg_interno = i.pro_codg_interno
and trunc (i.mov_dta_movimento) between '01/01/2022' and '19/12/2022'
having max(i.mov_preco_unitario) <> min(i.mov_preco_unitario) group by p.pro_codg_mestre, p.pro_descricao (editado)
Imagem
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
  • Membros

@Mizael Silva, não sei se você já conseguiu solucionar o problema, mas como o tópico ainda tá aberto vou tentar ajudar.

 

A forma que vejo para solucionar essa questão é através de subselects. Fiz uma estrutura simples com subselects, dependendo do banco de dados o comando para retornar o valor é diferente.

 

select
   (select (first 1, top 1) data from itens_nota x where x.id_produto = i.id_produto and x.data between [data inicio] and [data fim] order by x.data desc),
   (select (first 1, top 1) valor from itens_nota x where x.id_produto = i.id_produto and x.data between [data inicio] and [data fim] order by x.valor desc)
   
from
   itens_nota i,
   produto p 
where
   p.pro_codg_interno = i.pro_codg_interno 
   and trunc (i.mov_dta_movimento) between '01/01/2022' and '19/12/2022' 
having
   max(i.mov_preco_unitario) <> min(i.mov_preco_unitario) 
group by
   p.pro_codg_mestre,
   p.pro_descricao

Link para o comentário
Compartilhar em outros sites

  • 0
  • Membros
45 minutos atrás, Leandro Del Rio disse:

@Mizael Silva, não sei se você já conseguiu solucionar o problema, mas como o tópico ainda tá aberto vou tentar ajudar.

 

A forma que vejo para solucionar essa questão é através de subselects. Fiz uma estrutura simples com subselects, dependendo do banco de dados o comando para retornar o valor é diferente.

 

select
   (select (first 1, top 1) data from itens_nota x where x.id_produto = i.id_produto and x.data between [data inicio] and [data fim] order by x.data desc),
   (select (first 1, top 1) valor from itens_nota x where x.id_produto = i.id_produto and x.data between [data inicio] and [data fim] order by x.valor desc)
   
from
   itens_nota i,
   produto p 
where
   p.pro_codg_interno = i.pro_codg_interno 
   and trunc (i.mov_dta_movimento) between '01/01/2022' and '19/12/2022' 
having
   max(i.mov_preco_unitario) <> min(i.mov_preco_unitario) 
group by
   p.pro_codg_mestre,
   p.pro_descricao

Blz @Leandro Del Rio , aqui uso o oracle 11g, não entendi ao certo qual é a função dessa instrução aqui (first 1, top 1) e aonde o max e min entra na query

Editado por Mizael Silva
Link para o comentário
Compartilhar em outros sites

  • 0
  • Membros

@Mizael Silva, no oracle o comando é TOP 1.

Usando max e min, você busca o maior ou menor valor, já com o TOP você busca o primeiro.

Ao ordenar os valores ou datas em ordem crescente e buscar pelo TOP ele trará o maior ou mais atual, ou o contrario se utilizar a ordem decrescente.

Não sei se ajudei.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...