Usuário com melhor resposta
Consulta de Produtos que não vendeu Determinado Periodo

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
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
- Marcado como Resposta Decio Morais Neto quarta-feira, 17 de janeiro de 2018 11:52
-
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
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quarta-feira, 17 de janeiro de 2018 14:53
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
- Marcado como Resposta Decio Morais Neto quarta-feira, 17 de janeiro de 2018 11:52
-
-
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
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quarta-feira, 17 de janeiro de 2018 14:53
-
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]