Página 1 de 1

Retornar data vigente dos produtos

Enviado: Ter, 07 Jun 2022 12:33 am
por DUCOSTA11
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!

Re: Retornar data vigente dos produtos

Enviado: Dom, 12 Jun 2022 1:49 am
por tiago_pimenta
Estou sem um ambiente aqui agora para testar... Mas tenta agrupar pelo código do produto e na segunda coluna, coloca max(data)...

Re: Retornar data vigente dos produtos

Enviado: Seg, 25 Jul 2022 2:07 pm
por dr_gori
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