Como descobrir um grupo de registros que não pertencem a outro grupo

26/07/2018

0

Olá.
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

Gustavo

Responder

Posts

26/07/2018

Emerson Nascimento

Pergunta: os produtos de uma venda podem ser de qualquer uma das linhas ou todos precisam ser de uma única linha, desde que seja uma daquelas?

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?


Responder

26/07/2018

Gustavo

Nas vendas retornadas todos os produtos, de cada venda, devem pertencer as linhas 10, 12 e 13, não necessariamente um de cada linha.
No conjunto que colocou como exemplo deveria retornar a venda 1, 2 e 4. Pois nelas todos os produtos estão nas linhas desejadas
Responder

26/07/2018

Emerson Nascimento

Certo.

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)

Responder

26/07/2018

Gustavo

Valeu. Muito obrigado.
Não teria pensado nesta abordagem. Na verdade acho que nem entendi ainda pq funciona :-).
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar