Página 1 de 1

Listar zero para valores comuns

Enviado: Sex, 15 Jun 2018 11:56 pm
por vindalencio
Caros amigo, Estou com um problema que tenho um select...
ele lista várias NF essas tem a mesma OC (Ordem de compra) então quando tiver a mesma ordem de compra e o valor a NF for igual... deverá listar apenas o valor da primeira NF na coluna VALR e o resto das NFs deverão aparecer zero.

exemplo

Selecionar tudo

select NF, OC, VL, ID FROM NOTAS

Selecionar tudo

NF    OC   VL     ID
02     33   2,00  1
03     33   0,00  2
04     33   0,00  3
05     55   5,00  4
06     55   0,00  6
06     55   0,00  7
Se alguém puder me ajudar agradeço..

att
Vanderlei

Re: Listar zero para valores comuns

Enviado: Sex, 22 Jun 2018 2:21 pm
por geovani
Boa tarde,
Você pode usar a função LAG para verificar o registro anterior e se é a mesma ordem de compra e com o mesmo valor.
https://docs.oracle.com/cd/B19306_01/se ... ons070.htm

Selecionar tudo

--tabela temporária
with  temp_nf as(
  select 02 NF,    33 OC,   2 VL,     1 ID from dual  union all
  select 03 NF,    33 OC,   2 VL,     2 ID from dual union all
  select 04 NF,    33 OC,   2 VL,     3 ID from dual union all
  select 05 NF,    55 OC,   5 VL,     4 ID from dual union all
  select 06 NF,    55 OC,   5 VL,     6 ID from dual union all
  select 06 NF,    55 OC,   5 VL,     7 ID from dual
)


--consulta na tabela temporária
select
 nf,
 oc,
 vl,
 id,
 --campos adicionais para demonstração
 LAG(oc, 1, 0) OVER (ORDER BY oc)  oc_lag, --aqui pega a ordem de compra anterior
 LAG(vl, 1, 0) OVER (ORDER BY oc)  vl_lag,  --aqui pega o valor da ordem de compra anterior

 --Se o oc_lag for igual ao atual e se o  vl_lag for igual ao atual, então é 0, senão é o vl atual
 case
   when LAG(oc, 1, 0) OVER (ORDER BY oc) = oc
        and LAG(vl, 1, 0) OVER (ORDER BY oc) = vl then 0
   else vl
 end vl_novo 
from 
 temp_nf