8 Replies Latest reply: Feb 26, 2016 7:42 AM by Hamilton Junior RSS

    LEFT JOIN - Comparação de Datas

    Hamilton Junior

      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?

        • Re: LEFT JOIN - Comparação de Datas
          Cesar Accardi

          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;

            • Re: LEFT JOIN - Comparação de Datas
              Hamilton Junior

              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.

                • Re: LEFT JOIN - Comparação de Datas
                  Cesar Accardi

                  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;

                    • Re: LEFT JOIN - Comparação de Datas
                      Hamilton Junior

                      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.

                        • Re: LEFT JOIN - Comparação de Datas
                          Cesar Accardi

                          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.

                            • Re: LEFT JOIN - Comparação de Datas
                              Hamilton Junior

                              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.

                                • Re: LEFT JOIN - Comparação de Datas
                                  Cesar Accardi

                                  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;

                                    • Re: LEFT JOIN - Comparação de Datas
                                      Hamilton Junior

                                      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.