none
Consulta de Produtos que não vendeu Determinado Periodo RRS feed

  • Pergunta

  • Boa Noite Galera, tenho a seguinte select onde trago os produtos que nao teve saida em 6 meses porem ele esta duplicando os produtos, alias imagino q esta trazeno de acordo com a quantdade de vendas.

     

    SELECT PRO.CODPRODUTO,
           PRO.CODORIGINAL,
           P.DATAPEDIDO ULTIMAVENDA,
       PRO.Locaeq LOCACAO,
       SP.Eatueq ESTOQUE,
       SP.PRCueq Custo,
       SP.PRCueq * SP.Eatueq Total
    FROM PRODUTOS PRO
      JOIN SALDOPRODUTOS SP ON PRO.CODPRODUTO = SP.CODPRODUTO
      JOIN ITENSPEDIDO  IP  ON PRO.CODPRODUTO = IP.CODPRODUTO
      JOIN PEDIDOS P        ON IP.NROPEDIDO   = P.NROPEDIDO

    WHERE PRO.CODPRODUTO NOT IN 
         (SELECT IP.CODPRODUTO 
            FROM PEDIDOS P
            JOIN ITENSPEDIDO IP ON P.NROPEDIDO = IP.NROPEDIDO
           WHERE P.DATAPEDIDO >= GETDATE()-180 
         AND P.STATUS IN ('FATURADO')
    AND CANCELADO IS NULL
    AND CODTPO =1
      GROUP BY IP.CODPRODUTO )
    AND SP.Eatueq > 0 
    AND PRO.Situeq = 0  
    AND SP.CODEMP = 501 
    ORDER BY CODSUBGRUPO,ULTIMAVENDA desc

    

    terça-feira, 16 de janeiro de 2018 23:11

Respostas

  • Boa noite,

    Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    SELECT 
        PRO.CODPRODUTO,
        PRO.CODORIGINAL,
        CA.DATAPEDIDO ULTIMAVENDA,
        PRO.Locaeq LOCACAO,
        SP.Eatueq ESTOQUE,
        SP.PRCueq Custo,
        SP.PRCueq * SP.Eatueq Total
    FROM PRODUTOS PRO
    INNER JOIN SALDOPRODUTOS SP ON PRO.CODPRODUTO = SP.CODPRODUTO
    CROSS APPLY
    (
        SELECT 
            MAX(P.DATAPEDIDO) DATAPEDIDO
        FROM ITENSPEDIDO IP
        INNER JOIN PEDIDOS P ON P.NROPEDIDO = IP.NROPEDIDO
        WHERE
            IP.CODPRODUTO = PRO.CODPRODUTO AND
            P.STATUS = 'FATURADO' AND 
            CANCELADO IS NULL AND 
            CODTPO = 1
    ) CA
    WHERE
        PRO.Situeq = 0 AND 
        SP.Eatueq > 0 AND 
        SP.CODEMP = 501 AND
        CA.DATAPEDIDO < GETDATE()-180 
    ORDER BY 
        CODSUBGRUPO,
        ULTIMAVENDA desc

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 17 de janeiro de 2018 01:50
  • Bom dia,

    Com o operador Apply é possível executar uma query ou função para cada linha retornada pela query que está acima do operador, e os valores retornados pelo trecho dentro do Apply podem ser utilizados no restante da query.

    Na query que sugeri o Apply foi utilizado para obter a data da última saída de cada produto.

    Confira mais sobre o Apply na página abaixo:

    https://technet.microsoft.com/pt-br/library/ms175156.aspx

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 17 de janeiro de 2018 12:34

Todas as Respostas

  • Boa noite,

    Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    SELECT 
        PRO.CODPRODUTO,
        PRO.CODORIGINAL,
        CA.DATAPEDIDO ULTIMAVENDA,
        PRO.Locaeq LOCACAO,
        SP.Eatueq ESTOQUE,
        SP.PRCueq Custo,
        SP.PRCueq * SP.Eatueq Total
    FROM PRODUTOS PRO
    INNER JOIN SALDOPRODUTOS SP ON PRO.CODPRODUTO = SP.CODPRODUTO
    CROSS APPLY
    (
        SELECT 
            MAX(P.DATAPEDIDO) DATAPEDIDO
        FROM ITENSPEDIDO IP
        INNER JOIN PEDIDOS P ON P.NROPEDIDO = IP.NROPEDIDO
        WHERE
            IP.CODPRODUTO = PRO.CODPRODUTO AND
            P.STATUS = 'FATURADO' AND 
            CANCELADO IS NULL AND 
            CODTPO = 1
    ) CA
    WHERE
        PRO.Situeq = 0 AND 
        SP.Eatueq > 0 AND 
        SP.CODEMP = 501 AND
        CA.DATAPEDIDO < GETDATE()-180 
    ORDER BY 
        CODSUBGRUPO,
        ULTIMAVENDA desc

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 17 de janeiro de 2018 01:50
  • Ola amigo bom dia, aparentemente deu certo.

    No caso esse Cross Apply em que situação assim logica eu uso ele ?

    Obrigado.

    quarta-feira, 17 de janeiro de 2018 11:51
  • Bom dia,

    Com o operador Apply é possível executar uma query ou função para cada linha retornada pela query que está acima do operador, e os valores retornados pelo trecho dentro do Apply podem ser utilizados no restante da query.

    Na query que sugeri o Apply foi utilizado para obter a data da última saída de cada produto.

    Confira mais sobre o Apply na página abaixo:

    https://technet.microsoft.com/pt-br/library/ms175156.aspx

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 17 de janeiro de 2018 12:34
  • Ola amigo bom dia, aparentemente deu certo.

    No caso esse Cross Apply em que situação assim logica eu uso ele ?

    Obrigado.

    Decio,

    Tanto o Cross como o Outer são operadores utilizados em conjunto com Apply para realizar análise de dados em cada linha de valores processados pelo comando select respeitando as condições aplicadas para uma possível junção, basicamente o Outer Apply retorna valores que respeitam a condição inclusive valores Nulos(Null) ao contrário do Cross que desconsidera a existência de nulos.

    Veja o exemplo abaixo se te ajuda a entender melhor:

    Declare @Tabela1 Table
     (Codigo Int,
      Valor Int)
    
    Declare @Tabela2 Table
     (Codigo Int,
      Valor Int)
    
    Insert Into @Tabela1 Values (1,1),(2,2),(Null, Null)
    Insert Into @Tabela2 Values (1,1),(2,2),(3,3),(4,4),(5,5), (Null, Null)
    
    -- Utilizando operador Outer Apply --
    Select T.Codigo,
           T.Valor
    From @Tabela1 T Outer Apply (Select Codigo From @Tabela2
                               Where Codigo = T.Codigo) As T2
    
    -- Utilizando operador Cross Apply --
    Select T.Codigo,
           T.Valor
    From @Tabela1 T Cross Apply (Select Codigo From @Tabela2
                               Where Codigo = T.Codigo) As T2
    


    Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 20 de janeiro de 2018 01:03