Jump to content
Fórum Script Brasil
  • 0

Select para calcular o estoque


cezarhlima

Question

Bom dia,

Eu tenho uma tabela de estoque, onde cada movimentação de estoque é diferenciada por operação, exemplo v e DC são operações que diminuirão o estoque, enquanto C e DV são operações que aumentarão o estoque, preciso montar um select que faça o cálculo somando todas as quantidades das operações C e DV diminuindo pela quantidade das operações V e DC, que seja separado por data, para que eu possa saber em quais datas o meu estoque ficou negativo.

Obs: Versão do PostgreSQL 8.2.

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Esta consulta mostra a variação liquida de cada dia o que não é o saldo. É o saldo diário que você precisa? Se for seria muito mais fácil em uma versão mais nova. O 8.2 já não tem mais suporte.

select
    data,
    sum(C + DV) aumento,
    sum(V + DC) diminuicao,
    sum(C + DV - V - DC) variacao_liquida
from t
group by data
order by data

Link to comment
Share on other sites

  • 0
Esta consulta mostra a variação liquida de cada dia o que não é o saldo. É o saldo diário que você precisa? Se for seria muito mais fácil em uma versão mais nova. O 8.2 já não tem mais suporte.

select
    data,
    sum(C + DV) aumento,
    sum(V + DC) diminuicao,
    sum(C + DV - V - DC) variacao_liquida
from t
group by data
order by data

Eu preciso da total de cada dia, somando desde a data inicial de movimentação.

Exemplo:

01/11: 12C + 5DV -10V -2DC = 5 em estoque

02/11: 5EI + 5C + 2DV - 7V - 7DC = -2

Para saber todos os dias em que o estoque ficou negativo.

Quanto a operacao ela é uma coluna da tabela de estoque, que pode ser C, DV, DC e V.

Link to comment
Share on other sites

  • 0

Testei com esta tabela:

create table estoque (data date, operacao varchar(2), valor money);
insert into estoque (data, operacao, valor) values
('2012-01-01', 'C', 100),
('2012-01-01', 'V', 90),
('2012-01-03', 'DV', 20),
('2012-01-03', 'DC', 30),
('2012-01-05', 'V', 10),
('2012-01-05', 'C', 100),
('2012-01-06', 'DC', 120),
('2012-01-06', 'C', 10);
A consulta:
select
    data, aumento, diminuicao, variacao_liquida,
    coalesce(saldo_anterior, 0::money) + variacao_liquida saldo_atual
from (
    select
        data,
        sum(case when operacao in ('C', 'DV') then valor else 0::money end) aumento,
        sum(case when operacao in ('V', 'DC') then valor * -1 else 0::money end) diminuicao,
        sum(case when operacao in ('C', 'DV') then valor else valor * -1 end) variacao_liquida,
        (
            select
                sum(case when operacao in ('C', 'DV') then valor else valor * -1 end)
            from estoque e
            where data < estoque.data
        ) saldo_anterior
    from estoque
    group by data
) s
order by data
;
    data    | aumento | diminuicao | variacao_liquida | saldo_atual 
------------+---------+------------+------------------+-------------
 2012-01-01 | $100.00 |    -$90.00 |           $10.00 |      $10.00
 2012-01-03 |  $20.00 |    -$30.00 |          -$10.00 |       $0.00
 2012-01-05 | $100.00 |    -$10.00 |           $90.00 |      $90.00
 2012-01-06 |  $10.00 |   -$120.00 |         -$110.00 |     -$20.00

Para tabelas maiores vai ficar lento. Solução: Migrar para 9.2.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...