Como descobrir um grupo de registros que não pertencem a outro grupo
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:
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
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
Curtidas 0
Respostas
Emerson Nascimento
26/07/2018
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:
O que deveria ser retornado?
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?
GOSTEI 0
Gustavo
26/07/2018
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
No conjunto que colocou como exemplo deveria retornar a venda 1, 2 e 4. Pois nelas todos os produtos estão nas linhas desejadas
GOSTEI 0
Emerson Nascimento
26/07/2018
Certo.
Assim você saberá QUAIS vendas/pedidos atendem ao critério:
Assim você saberá QUANTAS vendas/pedidos atendem ao critério:
Assim obterá os dados das vendas que atendem ao critério:
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)
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)
GOSTEI 0
Gustavo
26/07/2018
Valeu. Muito obrigado.
Não teria pensado nesta abordagem. Na verdade acho que nem entendi ainda pq funciona :-).
Não teria pensado nesta abordagem. Na verdade acho que nem entendi ainda pq funciona :-).
GOSTEI 0