Retornar data vigente dos produtos

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
DUCOSTA11
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 07 Jun 2022 12:21 am
Localização: Bahia

Ola pessoal, boa noite!

Estou tentando trazer a data vigente de varios produtos de uma determinada tabela. Exemplo, eu tenho um produto 99856632 que tem preço cadastrado com varias datas pois foi sofrendo ajustes ao londo do tempo:

Selecionar tudo

99856632  20/12/2020
99856632  05/04/2021
99856632  27/05/2022
Nesse caso ai, quero trazer na query apenas a data 27/05/2022, sendo que não é so desse produto, tenho varios outros produtos com datas distintas e eu preciso apenas do registro que contenha a data atual de cada um deles. Estou tentando usar o MAX, porem tem trazido apenas um produto. Minha query esta assim:

Selecionar tudo

SELECT A.CD_PRO_FAT, A.CD_TAB_FAT, A.DT_VIGENCIA,
A.VL_HONORARIO, A.VL_OPERACIONAL, A.VL_TOTAL, A.SN_ATIVO,
B.CD_CONVENIO, B.CD_TUSS, B.DS_TUSS, B.CD_TIP_TUSS 
FROM DBAMV.VAL_PRO A    
  INNER JOIN DBAMV.TUSS B ON A.CD_PRO_FAT = B.CD_PRO_FAT
      WHERE A.CD_TAB_FAT = '336'   
     AND B.CD_CONVENIO = '188'  
     AND A.DT_VIGENCIA IN (SELECT MAX  (DT_VIGENCIA)
FROM VAL_PRO C WHERE C.CD_TAB_FAT = A.CD_TAB_FAT AND C.CD_TAB_FAT = '336')
          Group by A.CD_PRO_FAT, A.CD_TAB_FAT, A.DT_VIGENCIA,
A.VL_HONORARIO, A.VL_OPERACIONAL, A.VL_TOTAL, A.SN_ATIVO,
B.CD_CONVENIO, B.CD_TUSS, B.CD_PRO_FAT, B.CD_TIP_TUSS, B.DS_TUSS
Me deem uma luz amigos!
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Estou sem um ambiente aqui agora para testar... Mas tenta agrupar pelo código do produto e na segunda coluna, coloca max(data)...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Sim, pode tentar assim:

Selecionar tudo

SELECT A.CD_PRO_FAT, A.CD_TAB_FAT, A.DT_VIGENCIA,
A.VL_HONORARIO, A.VL_OPERACIONAL, A.VL_TOTAL, A.SN_ATIVO,
B.CD_CONVENIO, B.CD_TUSS, B.DS_TUSS, B.CD_TIP_TUSS 
FROM DBAMV.VAL_PRO A    
  INNER JOIN DBAMV.TUSS B ON A.CD_PRO_FAT = B.CD_PRO_FAT
      WHERE A.CD_TAB_FAT = '336'   
     AND B.CD_CONVENIO = '188'  
     AND (A.CD_PRO_FAT,A.DT_VIGENCIA( IN (SELECT CampoPROFAT,  MAX  (DT_VIGENCIA)
FROM VAL_PRO C WHERE C.CD_TAB_FAT = A.CD_TAB_FAT AND C.CD_TAB_FAT = '336'  group by CampoPROFAT)
          Group by A.CD_PRO_FAT, A.CD_TAB_FAT, A.DT_VIGENCIA,
A.VL_HONORARIO, A.VL_OPERACIONAL, A.VL_TOTAL, A.SN_ATIVO,
B.CD_CONVENIO, B.CD_TUSS, B.CD_PRO_FAT, B.CD_TIP_TUSS, B.DS_TUSS


Eu gosto de usar funções analíticas pra deixar a DATA INICIO e FIM na mesma linha.
Algo assim:

Selecionar tudo

SELECT ename, hiredate, hiredate-100 hiredate_pre,
       COUNT(*)
       OVER (
          ORDER BY hiredate ASC
          RANGE 100 PRECEDING
       ) cnt
  FROM emp
 ORDER BY hiredate ASC
 /
 
 Name     Hired      Hired-100  Cnt
-------- ---------- ---------- ---
SMITH    17-DEC-80  08-SEP-80    1
ALLEN    20-FEB-81  12-NOV-80    2
WARD     22-FEB-81  14-NOV-80    3
JONES    02-APR-81  23-DEC-80    3
BLAKE    01-MAY-81  21-JAN-81    4
CLARK    09-JUN-81  01-MAR-81    3
TURNER   08-SEP-81  31-MAY-81    2
MARTIN   28-SEP-81  20-JUN-81    2
KING     17-NOV-81  09-AUG-81    3
JAMES    03-DEC-81  25-AUG-81    5
FORD     03-DEC-81  25-AUG-81    5
MILLER   23-JAN-82  15-OCT-81    4
SCOTT    09-DEC-82  31-AUG-82    1
ADAMS    12-JAN-83  04-OCT-82    2
 
Daí com base nesse resultado, basta pegar qual linha está ativa.
Ou seja:

Selecionar tudo

INICIO <= Sysdate AND FIM > Sysdate
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes