Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carlos Marcelo

Compara Resultado de SUM de uma tabela com campo de outra

Recommended Posts

Boa tarde senhores,

 

Estou desenvolvendo um sistema em delphi 6 e utilizando como base de dados o firebird 2.0.

Tenho uma tabela que tem os seguintes campos:

MOVIMENTO

(

Codigoproduto varchar(20),

TipoMovimento Varchar(2),

quantidade float

)

 

Outra tabela:

FISICO

(

Codigoproduto varchar(20),

quantidade float

);

 

Faço a seguinte instrução SQL:

 

SELECT A.CODIGOPRODUTO,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'SI' THEN A.QUANTIDADE END) AS SALDOINICIAL,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'CP' THEN A.QUANTIDADE END)AS COMPRAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'DV' THEN A.QUANTIDADE END)AS DEVOLUCAOVENDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'VD' THEN A.QUANTIDADE END)AS VENDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'PD' THEN A.QUANTIDADE END)AS PERDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'DC' THEN A.QUANTIDADE END)AS DEVOLUCAOCOMPRAS,

SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) AS ENTRADAS,

SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END)) AS SAIDAS,

(SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) - SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END))) AS SALDO

FROM INVENTARIO A

GROUP BY A.CODIGOPRODUTO

 

O que eu queria era juntar ao resultado dessa query o campo quantidade da tabela FISICO, desta forma poderia comparar o estoque apurado conforme a movimentação e o estoque fisico apurado. E mostrar num GRID algo do tipo:

 

CodigoProduto|SALDOINICIAL|COMPRAS|DEVOLUCAOVENDAS|VENDAS|PERDAS|DEVOLUCAOCOMPRA

S|ENTRADAS|SAIDAS|SALDO|QUANTIDADE(TABELA FISICO)|DIFERENCA(SALDO-QUANTIDADE)

14546.36741 | 100 | 600 | 0 | 300 | 0 | 0 | 100 | 700 | 400 | 300 | 100 | 200

 

Fiz a seguinte query, porém não deu o resultado esperado:

 

SELECT A.CODIGOPRODUTO,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'SI' THEN A.QUANTIDADE END) AS SALDOINICIAL,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'CP' THEN A.QUANTIDADE END)AS COMPRAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'DV' THEN A.QUANTIDADE END)AS DEVOLUCAOVENDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'VD' THEN A.QUANTIDADE END)AS VENDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'PD' THEN A.QUANTIDADE END)AS PERDAS,

SUM(CASE WHEN A.TIPOMOVIMENTO = 'DC' THEN A.QUANTIDADE END)AS DEVOLUCAOCOMPRAS,

SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) AS ENTRADAS,

SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END)) AS SAIDAS,

(SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) - SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END))) AS SALDO,

SUM(B.QTDE) AS FISICO,

(SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) - SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END)) - SUM(B.QTDE)) AS DIFERENCA

FROM INVENTARIO A LEFT OUTER JOIN ESTOQUE B ON (A.CODIGOPRODUTO = B.CODIGOPRODUTO)

GROUP BY A.CODIGOPRODUTO, B.codigoproduto

 

 

Como devo proceder? Obrigado pela antenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer um subselect na seleção, algo assim:

 

SELECT A.CODIGOPRODUTO,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'SI' THEN A.QUANTIDADE END) AS SALDOINICIAL,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'CP' THEN A.QUANTIDADE END)AS COMPRAS,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'DV' THEN A.QUANTIDADE END)AS DEVOLUCAOVENDAS,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'VD' THEN A.QUANTIDADE END)AS VENDAS,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'PD' THEN A.QUANTIDADE END)AS PERDAS,
SUM(CASE WHEN A.TIPOMOVIMENTO = 'DC' THEN A.QUANTIDADE END)AS DEVOLUCAOCOMPRAS,
SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) AS ENTRADAS,
SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END)) AS SAIDAS,
(SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'SI') OR (A.TIPOMOVIMENTO = 'CP') OR (A.TIPOMOVIMENTO = 'DV')) THEN A.QUANTIDADE END)) - SUM((CASE WHEN ((A.TIPOMOVIMENTO = 'VD') OR (A.TIPOMOVIMENTO = 'PD') OR (A.TIPOMOVIMENTO = 'DC')) THEN A.QUANTIDADE END))) AS SALDO,

(select sum(fisico.quantidade)
from fisico where fisico.codproduto = a.codproduto) as QtdeFisico

FROM INVENTARIO A
GROUP BY A.CODIGOPRODUTO

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.