Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
junior_ehlke
Creator III
Creator III

LEFT JOIN - Comparação de Datas

Bom dia Senhores,

Tenho em meu projeto, uma tabela que mostra quando o item entrou em Ruptura, ou seja, quando seu estoque zerou,

em uma segunda tabela, eu tenho a data que foi feito o pedido deste mesmo produto, montei uma estrutura +/- assim:

PROD_RUPTURA:

LOAD

     unidade,

     codigo_produto,

     MIN(DATE(data_ruptura)) as data_ruptura

Resident tbl_produtos

group by

    unidade,

     codigo_produto;

LEFT JOIN (PROD_RUPTURA)

LOAD    

     unidade,

     codigo_produto,

     data_pedido

Resident tbl_pedidos

O problema que nesta estrutura, se o produto X acabou o estoque no dia 22/02 por exemplo,

com o Join, eu vinculo os pedidos anteriores, ou seja, o produto acabou no dia 22 mas teve pedido no dia 18.

Preciso fazer uma condição que diga para vincular apenas os produtos com data do pedido maior ou igual a data da ruptura.

Se não houver pedido, este campo ficará nulo.

Como posso fazer isto?

Labels (4)
1 Solution

Accepted Solutions
cesaraccardi
Specialist
Specialist

Entendi Hamilton, e nesse caso voce teria que trazer estes campos na carga tambem mas sem inclui-los no group by... Uma forma de fazer isso (nao sei se vai atender ao que voce precisa) mas seria usando a funcao FirstSortedValue(), o exemplo abaixo tras o numero do pedido com a maior data sem quebrar a agregacao:

LEFT JOIN (TMP_PROD_RUPTURA)

LOAD   

     unidade,

     codigo_produto,

     max(data_pedido) as data_pedido,

     firstsortedvalue(numero_pedido, -data_pedido) as numero_pedido

Resident tbl_pedidos

GROUP BY

     unidade,

     codigo_produto;

View solution in original post

8 Replies
cesaraccardi
Specialist
Specialist

Ola Hamilton,

Voce pode adicionar uma nova carga depois para remover os pedidos anteriores a data de ruptura, voce pode renomear a sua tabela para TMP_PROD_RUPTURA para fazer o join e depois:

PROD_RUPTURA:

NOCONCATENATE

LOAD

     unidade,

     codigo_produto,

     data_ruptura,

     data_pedido

RESIDENT

     TMP_PROD_RUPTURA WHERE data_ruptura <= data_pedido OR IsNull(data_pedido);

DROP TABLE TMP_PROD_RUPTURA;

junior_ehlke
Creator III
Creator III
Author

Cesar,

funcionou certinho com um problema,

no primeiro JOIN, seguindo a mesma lógica do exemplo, o produto acabou no dia 22 e o último pedido que eu tenho foi no dia 18, portanto este item ainda não tem pedido, correto?

Se eu fizer esta exclusão data_ruptura <= data_pedido, ele vai deletar este item, ao invés de deixar o valor data_pedido nulo, eu vou ter informação apenas dos itens que foram pedidos, e não dos que não foram.

Tentei fazer um IF seguindo sua logica de carregar novamente a tabela:

if(data_pedido< data_ruptura ,'sem pedido', 'com pedido') as status_pedido

Porém se o produto X teve pedido ANTES e DEPOIS da ruptura, ele vai dizer que tem e que não tem pedido, duplicando a informação.

cesaraccardi
Specialist
Specialist

Entendi Hamilton, e se voce carregar somente os ultimos pedidos de cada produto? Da mesma forma que voce faz com a ruptura mas usando Max(data_pedido). Dessa forma voce pode retirar a clausula WHERE:

PROD_RUPTURA:

NOCONCATENATE

LOAD

     unidade,

     codigo_produto,

     data_ruptura,

     if(data_pedido>=data_ruptura,data_pedido,null()) as data_pedido,

     if(data_pedido< data_ruptura ,'sem pedido', 'com pedido') as status_pedido

RESIDENT

     TMP_PROD_RUPTURA;

DROP TABLE TMP_PROD_RUPTURA;

junior_ehlke
Creator III
Creator III
Author

Cesar, para fazer o MAX(date) eu preciso agrupar por número do pedido, então, qual é a maior data do pedido x? é a data dele mesmo hehe. vou fazer uma condição, exemplo, se a data do pedido for menor que a data do do produto, ele vair criar um campo chamado "Erro" por exemplo, ai eu deleto esse campo depois.

if(data_ruptura<data_pedido, "ERRO", data_pedido) as status_pedido

de momento deve funcionar.

cesaraccardi
Specialist
Specialist

Ola Hamilton,

Voce nao precisa necessariamente agregar pelo numero do pedido, certo? Se voce agregar pelo codigo do produto deve obter a maior data entre os pedidos.

junior_ehlke
Creator III
Creator III
Author

Preciso sim Cesar, agrupar pelo numero do pedido e pela data da baixa ainda,

eu posso ter mais de um pedido no mesmo item, e o pedido pode ou ter sido recebido (baixado)

pois preciso analisar entre pedido e recebimento.

cesaraccardi
Specialist
Specialist

Entendi Hamilton, e nesse caso voce teria que trazer estes campos na carga tambem mas sem inclui-los no group by... Uma forma de fazer isso (nao sei se vai atender ao que voce precisa) mas seria usando a funcao FirstSortedValue(), o exemplo abaixo tras o numero do pedido com a maior data sem quebrar a agregacao:

LEFT JOIN (TMP_PROD_RUPTURA)

LOAD   

     unidade,

     codigo_produto,

     max(data_pedido) as data_pedido,

     firstsortedvalue(numero_pedido, -data_pedido) as numero_pedido

Resident tbl_pedidos

GROUP BY

     unidade,

     codigo_produto;

junior_ehlke
Creator III
Creator III
Author

Cesar, muito obrigado. Não conhecia este comando.

Fiz da seguinte forma:


MAX(DATE(data_pedido))                                        as data_pedido,

firstsortedvalue(ID_PEDIDOC, -data_pedido)            as numero_pedido,

firstsortedvalue(data_baixa, -data_pedido)                 as data_baixapedido



Assim eu trago o numero do pedido com a maior data

e a baixa com a maior data do pedido, acredito que de certo.

Obrigado novamente pelo retorno.

Abraço.