Fórum Sql complicada. Conteúdo de tres tabelas. #271951
11/03/2005
0
Tenho as seguinte tabelas e seus campos:
Produto -> GRUPO, CODIGO, SALDO;
Pedido -> NUMERO, FATURADO, DATA;
ItemPedido -> NUMERO, CODIGO, QTDADE;
Preciso criar uma sql, q mostre o SALDO q existe na tabela Produto, sendo que deve ser entre um intervalo de GRUPO (between) e deve ainda diminuir da QTDADE que tiver na tabela ItemPedido, mas somente dos registros do Pedido em que FATURADO is null e num intervalo de DATA (between) informado. :?
Fiz assim:
Funciona. Mas me retorna o (SALDO-QTDADE) apenas dos CODIGO que existe na tabela ItemPedido. E eu quero que apareça o SALDO de todos os CODIGO da tabela PRODUTO (desde que respeite os filtros da sql). E se tb existir o CODIGO no ItemPedido, diminua do SALDO.
O detalhe é que pode existir o mesmo CODIGO em vários ItemPedido.
Podem me ajudar a resolver isto?
Ivonei
Curtir tópico
+ 0Posts
11/03/2005
Nandolh
Gostei + 0
11/03/2005
Ivonei
Acabei de testar o inner join pelos dois acima e não deu certo. Mostra todos os CODIGO mas com SALDO fora da realidade. :?
Gostei + 0
11/03/2005
Emerson Nascimento
de qualquer forma, teste a instrução abaixo e veja no que dá...
select prod.codigo, prod.grupo, prod.saldo, sum(iped.qtdade) qtdreservada, prod.saldo-sum(iped.qtdade) saldoprevisto from produto prod left join itempedido iped on (iped.codigo=prod.codigo) left join pedido ped on (ped.numero=iped.numero and ped.faturado is null) where (prod.grupo between :GrupoIni and :GrupoFim) and (ped.data between :DataIni and :DataFim) group by prod.codigo, prod.grupo, prod.saldo
Gostei + 0
11/03/2005
Diogoalles
por exemplo
SELECT...
....
FROM TABELA1
LEFT OUTER JOIN(TABELA1.CAMPO1 = TABELA2.CAMPO1)
...
no caso acima serão exibidos todos os dados da TABELA1, mesmo que a TABELA2 não tenha registros para relacionar.
abraço
Diogo.
Gostei + 0
11/03/2005
Diogoalles
SELECT... .... FROM TABELA1 LEFT OUTER JOIN TABELA2 ON(TABELA1.CAMPO1 = TABELA2.CAMPO1) ...
no caso acima serão exibidos todos os dados da TABELA1, mesmo que a TABELA2 não tenha registros para relacionar.
abraço
Diogo.
Gostei + 0
11/03/2005
Ivonei
Era quase isto emerson.en. Resolvi o problema (com a sua ajuda, é claro) trocando o ultimo left join por inner join. :)
Assim:
Estou usando firebird. Agora só preciso descobrir um jeito de mostrar somente os registros que tiverem o valor do saldoprevisto negativo. :?
Obrigado.
Gostei + 0
11/03/2005
Ivonei
SELECT... .... FROM TABELA1 LEFT OUTER JOIN TABELA2 ON(TABELA1.CAMPO1 = TABELA2.CAMPO1) ...
Agradeço a atenção Diogoalles. Mas já havia solucionado o problema. :wink:
Gostei + 0
12/03/2005
Emerson Nascimento
select prod.codigo, prod.grupo, prod.saldo, sum(iped.qtdade) qtdreservada, prod.saldo-sum(iped.qtdade) saldoprevisto from produto prod left join itempedido iped on (iped.codigo=prod.codigo) INNER JOIN pedido ped on (ped.numero=iped.numero and ped.faturado is null) where (prod.grupo between :GrupoIni and :GrupoFim) and (ped.data between :DataIni and :DataFim) group by prod.codigo, prod.grupo, prod.saldo having (prod.saldo-sum(iped.qtdade))<0
Gostei + 0
16/03/2005
Ivonei
Realmente o having resolve este problema.
Infelizmente achei que o sql estava correto. Ledo engano. :(
Por isso demorei para responder esta msg. Desde o final de semana estava fazendo varios testes para ver se encontrava uma soluçao (sem sucesso). :cry:
Ele teria que retornar todos os codigos da clausula WHERE, mostrando o campo C.QTDPRO e se tiver algum que tenha movimento (em ESANSI) (SUM(A.QTDNSI)) deve diminuir de C.QTDPRO.
Segue abaixo o sql que estou querendo usar, mas sem sucesso. Já testei o segundo join de várias formas:
INNER JOIN ESANST- Retorna vários saldos negativos e incorretos;
LEFT JOIN ESANST- Retorna o valor correto, mas mostra somente a QTDPRO dos produtos que aparecem também em ESANSI. Ou seja, só o que está no INNER JOIN de ESANST.
Uso firebird 1.5 e no sistema IBQuery e IBDataset.
tabelas:
ESAPRO - Produtos;
ESANST - Pedidos;
ESANSI - Itens dos pedidos;
Os campos são:
C.qtdpro - Qtdade do produto;
C.codpro - Codigo do produto;
C.grupro - Grupo do produto;
A.QTDNSI - Qtdade do item no pedido;
A.CODNSI - Codigo produto no item do pedido;
A.NPCNSI - Codigo do pedido na tabela item do pedido;
B.NPCNST - Codigo do pedido;
B.NNFNST - Numero da NF (depois de faturar)
B.datnst - Data do pedido;
Por favor, me ajudem nessa.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)