Como descobrir um grupo de registros que não pertencem a outro grupo
26/07/2018
0
Tenho a seguinte situação com 3 tabelas:
- Produtos (cadastro dos produtos)
- Vendas (registro da venda com data de entrega e referencia ao cliente)
- Movtoestoque ( detalhamento da venda, com os itens)
O que preciso: Descobrir a quantidade de vendas em que TODOS os produtos, da venda, sejam de determinadas linhas, mas não tenha nenhum outro produto de outra linha.
Fiz o seguinte SQL:
SELECT V.CD_VENDA, P.DESCRICAO_PRODUTO FROM MOVTOESTOQUE M LEFT JOIN VENDAS V ON (V.CD_VENDA=M.ME_NUM_DOCTO) LEFT JOIN PRODUTOS P ON (M.ME_CODIGO_PRODUTO=P.CD_PRODUTO) WHERE P.PCE_LINHA IN (10,12,13) AND V.VND_DTENTREGA > '2018-01-01 00:00:00' AND V.CD_VENDA NOT IN ( SELECT CD_VENDA FROM MOVTOESTOQUE LEFT JOIN VENDAS ON (CD_VENDA=ME_NUM_DOCTO) LEFT JOIN PRODUTOS ON (ME_CODIGO_PRODUTO=CD_PRODUTO) WHERE VND_DTENTREGA > '2018-01-01 00:00:00' AND PCE_LINHA NOT IN (10,12,13) )
Ao executar parece entrar em um loop infinito e "trava" a consulta.
Alguém tem sugestões de como fazer esta consulta de forma mais inteligente?
Obrigado
Gustavo
Posts
26/07/2018
Emerson Nascimento
Com os dados abaixo:
venda produto linha 1 1 10 1 2 12 1 3 13 2 1 10 2 4 10 2 5 10 3 1 10 3 2 12 3 3 13 3 6 25 4 7 13 4 8 13 4 9 13
O que deveria ser retornado?
26/07/2018
Gustavo
No conjunto que colocou como exemplo deveria retornar a venda 1, 2 e 4. Pois nelas todos os produtos estão nas linhas desejadas
26/07/2018
Emerson Nascimento
Assim você saberá QUAIS vendas/pedidos atendem ao critério:
SELECT M.ME_NUM_DOCTO FROM MOVTOESTOQUE M INNER JOIN VENDAS V ON (V.CD_VENDA=M.ME_NUM_DOCTO) LEFT JOIN PRODUTOS P ON (P.CD_PRODUTO=M.ME_CODIGO_PRODUTO) AND (P.PCE_LINHA IN (10,12,13)) WHERE V.VND_DTENTREGA > '2018-01-01 00:00:00' GROUP BY M.ME_NUM_DOCTO HAVING COUNT(M.ME_CODIGO_PRODUTO) = COUNT(P.CD_PRODUTO)
Assim você saberá QUANTAS vendas/pedidos atendem ao critério:
SELECT COUNT(*) FROM ( SELECT M.ME_NUM_DOCTO FROM MOVTOESTOQUE M INNER JOIN VENDAS V ON (V.CD_VENDA=M.ME_NUM_DOCTO) LEFT JOIN PRODUTOS P ON (P.CD_PRODUTO=M.ME_CODIGO_PRODUTO) AND (P.PCE_LINHA IN (10,12,13)) WHERE V.VND_DTENTREGA > '2018-01-01 00:00:00' GROUP BY M.ME_NUM_DOCTO HAVING COUNT(M.ME_CODIGO_PRODUTO) = COUNT(P.CD_PRODUTO) ) T
Assim obterá os dados das vendas que atendem ao critério:
SELECT V.* FROM VENDAS V INNER JOIN ( SELECT M.ME_NUM_DOCTO FROM MOVTOESTOQUE M INNER JOIN VENDAS V ON (V.CD_VENDA=M.ME_NUM_DOCTO) LEFT JOIN PRODUTOS P ON (P.CD_PRODUTO=M.ME_CODIGO_PRODUTO) AND (P.PCE_LINHA IN (10,12,13)) WHERE V.VND_DTENTREGA > '2018-01-01 00:00:00' GROUP BY M.ME_NUM_DOCTO HAVING COUNT(M.ME_CODIGO_PRODUTO) = COUNT(P.CD_PRODUTO) ) T ON T.ME_NUM_DOCTO = V.CD_VENDA
Agora fica a cargo da sua imaginação/necessidade...
P.S: Para ter uma boa performance em qualquer uma das consultas, será necessário ter ao menos os seguintes índices:
VENDAS (CD_VENDA)
MOVTOESTOQUE (ME_NUM_DOCTO)
PRODUTOS (CD_PRODUTO, PCE_LINHA)
26/07/2018
Gustavo
Não teria pensado nesta abordagem. Na verdade acho que nem entendi ainda pq funciona :-).
Clique aqui para fazer login e interagir na Comunidade :)