Sql complicada. Conteúdo de tres tabelas.
Olá pessoal
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?
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:
[color=green:f06b86c52d]Select A.CODIGO, (C.CODIGO-SUM(A.QTDADE) as TOTAL, C.CODIGO, C.GRUPO, C.SALDO from ItemPedido A, Produto C
INNER JOIN Pedido B ON A.NUMERO=B.NUMERO AND B.FATURADO IS NULL AND B.DATA between :Dataini and :Datafim
WHERE C.CODIGO=A.CODIGO and C.GRUPO between :ini and :fim
GROUP BY A.CODIGO, C.CODIGO, C.GRUPO, C.SALDO[/color:f06b86c52d]
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
Curtidas 0
Respostas
Nandolh
11/03/2005
Já tentou Right outer join ou left outer join?
GOSTEI 0
Ivonei
11/03/2005
Já tentou Right outer join ou left outer join?
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
Emerson Nascimento
11/03/2005
pra podermos dar uma solução melhor, seria ideal saber qual o banco de dados que você está utilizando.
de qualquer forma, teste a instrução abaixo e veja no que dá...
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
Diogoalles
11/03/2005
Eu utilizo o Firebird e no caso uso LEFT OUTER JOIN para relacionar as tabelas..
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.
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
Diogoalles
11/03/2005
ops... corrigindo o que escrevi, o certo é:
no caso acima serão exibidos todos os dados da TABELA1, mesmo que a TABELA2 não tenha registros para relacionar.
abraço
Diogo.
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
Ivonei
11/03/2005
pra podermos dar uma solução melhor, seria ideal saber qual o banco de dados que você está utilizando.
de qualquer forma, teste a instrução abaixo e veja no que dá...
Era quase isto emerson.en. Resolvi o problema (com a sua ajuda, é claro) trocando o ultimo left join por inner join. :)
Assim:
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)
[b:df1059b872]INNER JOIN[/b:df1059b872] 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
Estou usando firebird. Agora só preciso descobrir um jeito de mostrar somente os registros que tiverem o valor do saldoprevisto negativo. :?
Obrigado.
GOSTEI 0
Ivonei
11/03/2005
ops... corrigindo o que escrevi, o certo é:
no caso acima serão exibidos todos os dados da TABELA1, mesmo que a TABELA2 não tenha registros para relacionar.
abraço
Diogo.
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
Emerson Nascimento
11/03/2005
somente os valores do saldoprevisto negativo:
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
Ivonei
11/03/2005
Olá emerson.en.
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.
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.
[color=green:41f5f5ce4c]Select C.qtdpro-SUM(A.QTDNSI) SALDO, C.despro, C.codpro, C.grupro, C.subpro, C.csepro from ESAPRO C
LEFT JOIN esansi A ON (A.CODNSI=C.CODPRO)
INNER JOIN esanst B ON (A.NPCNSI=B.NPCNST AND B.NNFNST IS NULL AND B.datnst between ´01/01/04´ and ´03/03/05´)
WHERE C.Grupro between 1 and 3 and blqpro=´N´
GROUP BY C.despro, C.codpro, C.grupro, C.subpro, C.csepro, C.qtdpro[/color:41f5f5ce4c]
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