Pegar registros diferentes da mesma tabela

31/07/2017

0

Bom dia pessoal,

Seguinte... Tenho a tabela estoque_historico

cd_item desc_item m_ref a_ref Qtd_m_ant entrada saida saldo_final a_m_ref
1 Item 1 5 2017 53 0 3 56 052017
2 Item 2 5 2017 10 20 11 10 052017
1 Item 1 6 2017 55 0 1 52 062017
2 Item 2 6 2017 19 2 1 11 062017

Preciso fazer o calculo de saldo final de um item ((vi.qtd_m_ant - a.saida) + a.entrada) saldo_final , pegando a movimentação (entrada e saída) com o filtro de um mês/ano, por exemplo 06/2016, subtraindo a qtd_m_ant filtrando outro mês, por exemplo 05/2017, então fiz um view ou um sub-select, os dois na verdade ajudaram parcialmente, pois retornam apenas itens que tiveram movimentação realmente, ou seja, valores de entrada e saída, no caso do exemplo acima o item 1 não retorna porque não teve quantidade de entrada que é o problema numero 1 que estou.

movimentação item 1 06/2017 - (vi.qtd_m_ant - a.saida) + a.entrada) saldo_final ->> (53 - 1 ) + 0) = 52
movimentação item 2 06/2017 - (vi.qtd_m_ant - a.saida) + a.entrada) saldo_final ->> (10 - 1 ) + 2) = 11

select e.cd_itens,
e.m_ref,
e.a_ref,
vi.m_ref mes_ant,
vi.a_ref ano,
vi.qtd_m_ant,
e.entrada,
e.saida,
((vi.qtd_m_ant - e.saida) + e.entrada) saldo_final
from estoque_historico e
inner join itens i on (i.empresa = e.empresa and
i.cd_itens = e.cd_itens)
inner join vi_qtdmesanterior vi on (vi.cd_itens = e.cd_itens and vi.empresa = e.empresa)
where e.empresa = '01'
and i.empresa = '01'
--and vi.empresa = '01'
and vi.m_ref = '05'
and vi.a_ref = '2017'
and e.m_ref = '06'
and e.a_ref = '2017'
group by
e.cd_itens,
e.m_ref,
e.a_ref,
vi.m_ref,
vi.a_ref,
vi.qtd_m_ant,
e.entrada,
e.saida


**vi_qtdmesanterior**
select e.cd_itens,
e.m_ref,
e.a_ref,
e.qtd_m_ant,
e.empresa
from estoque_historico e
where e.empresa = '01'
group by
e.cd_itens,
e.m_ref,
e.a_ref,
e.qtd_m_ant,
e.empresa
order by
e.cd_itens


Após este impasse de não conseguir retornar os itens sem movimentação de entrada ou saída, ou seja, que estivessem com quantidade zero identifiquei que precisaria retornar também todos os itens para minha necessidade real (problema numero 2) na sua ultima data de movimento, resolvi então fazer PARTITION BY para pegar estes, após fiz um max-1 para pegar o penúltimo valor do control que é a minha ultima movimentação do item e a quantidade do mês anterior, porém não consigo colocar o campo qtd_m_ant no max que não me retorna o penúltimo movimento.


select t.cd_itens,
t.a_m_ref,
ROW_NUMBER() OVER (PARTITION BY t.cd_itens ORDER BY t.m_ref) AS CONTROL
from estoque_historico t
where t.a_ref = 2017

cd_itens a_m_ref CONTROL
1 2 201701 1
2 2 201702 2
3 2 201703 3
4 2 201704 4
5 2 201706 5
6 1 201703 1
7 1 201704 2
8 1 201705 3
9 1 201706 4


Obs.: Na tabela grava-se apenas uma linha por movimentação do item, ou seja, se o item não teve movimentação no ultimo mês, não haverá registro dele, por isso a necessidade do PARTITION BY

Em resumo... Preciso pegar de uma mesma tabela ***estoque_historico*** para construir uma view:

1 - Os itens que tiveram movimentação no ultimo mês, levando em consideração o valor que está no campo qtd_m_ant no mês anterior a este e trazer todos os itens, apesar dos valores entrada e saída, estiverem zerados no mês de movimentação.
2 - Todos os itens da tabela estoque_historico com seu ultimo movimento.


É isso pessoal, me ajudem quanto a isto fazendo um grande favor!!?

Obrigada desde já! :)
Nayara

Nayara

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar