GARANTIR DESCONTO

Fórum Sql complicada. Conteúdo de tres tabelas. #271951

11/03/2005

0

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:
[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

Ivonei

Responder

Posts

11/03/2005

Nandolh

Já tentou Right outer join ou left outer join?


Responder

Gostei + 0

11/03/2005

Ivonei

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. :?


Responder

Gostei + 0

11/03/2005

Emerson Nascimento

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

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



Responder

Gostei + 0

11/03/2005

Diogoalles

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.


Responder

Gostei + 0

11/03/2005

Diogoalles

ops... corrigindo o que escrevi, o certo é:


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.


Responder

Gostei + 0

11/03/2005

Ivonei

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.


Responder

Gostei + 0

11/03/2005

Ivonei

ops... corrigindo o que escrevi, o certo é:
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.


Agradeço a atenção Diogoalles. Mas já havia solucionado o problema. :wink:


Responder

Gostei + 0

12/03/2005

Emerson Nascimento

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



Responder

Gostei + 0

16/03/2005

Ivonei

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.

[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.


Responder

Gostei + 0

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

Aceitar