Listar zero para valores comuns

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
vindalencio
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 140
Registrado em: Qui, 16 Fev 2006 9:42 am
Localização: Curitiba
Vanderlei Indalencio

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
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

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
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 12 visitantes