Ir para conteúdo
  • 0

Consulta base estoque


Rafael Jefferson

Pergunta

  • Alunos

Boa noite,
comecei a utilizar sql tem pouco tem nas minhas rotinas diarias,
hoje me deparei com um problema que a principio é simple, mas não dei conta ainda kkk

tenho uma base de estoque com MES, ANO, ITEM, QTDE INICIAL, ENTRADA, SAIDA, QTD FINAL.

MONTEI UM SCRIPT PRA PEGAR A POSIÇÃO FINAL DO MES. 
SELECT
COD_EMPRESA,
COD_ITEM,
MES_REF,
ANO_REF,
QTD_MES_ANT,
QTD_ENTRADA ,
QTD_SAIDA ,
QTD_FINAL,
CASE
           WHEN QTD_ENTRADA = 0 AND QTD_SAIDA = 0 AND QTD_MES_ANT = 0 THEN 'SEM MOVIMENTO' ELSE 'MOVIMENTO OK' END AS MOVIMENTO
FROM DW_ESTOQUE_HIST
WHERE ANO_REF IN ('2023', '2024')
AND COD_EMPRESA = '01'
AND MES_REF = '06'
ORDER BY ANO_REF , MES_REF

ENTRETANTO ESSA BASE DE DADOS, SÓ MOSTRA A QTD FINAL SE UM ITEM TIVER MOVIMENTAÇÃO NO MES, 
POR EXEMPLO, SE TIVER MOVIMENTO DE ENTRADA E SAIDA MESMO SE A QTDE FINAL FOR ZERO, ELA TRAZ A INFORMAÇÃO.
AGORA SE EU TIVER UM ITEM COM SALDO NO ESTOQUE MAS NÃO TIVE MOVIMENTAÇÃO DE ENTRADA E SAIDA, ELA NÃO TRAZ A INFORMAÇÃO.

TEM ALGUMA FORMA DE CRIAR UMA LOGICA PARA TRAZER O ULTIMO SALDO FINAL DO ITEM PARA OS MESES QUE NÃO TIVERAM MOVIMENTAÇÃO?
EXEMPLO, 

MES   -    ITEM  -   QTD FINAL -   ENTRADA -  SAIDA
02          AAA             100                     150             50
03         AAA             100
04       AAA               100
ATÉ TER MOVIMENTAÇÃO NOVAMENTE. 

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos

Tente utilizar um CTE para fazer isso: faça um teste com essa query.

 

WITH CTE_ESTOQUE AS (
    SELECT
        COD_EMPRESA,
        COD_ITEM,
        MES_REF,
        ANO_REF,
        QTD_ENTRADA,
        QTD_SAIDA,
        QTD_FINAL,
        LAG(QTD_FINAL) OVER (PARTITION BY COD_EMPRESA, COD_ITEM ORDER BY ANO_REF, MES_REF) AS QTD_MES_ANT
    FROM DW_ESTOQUE_HIST
    WHERE ANO_REF IN ('2023', '2024')
    AND COD_EMPRESA = '01'
)
SELECT
    COD_EMPRESA,
    COD_ITEM,
    MES_REF,
    ANO_REF,
    CASE
        WHEN QTD_ENTRADA = 0 AND QTD_SAIDA = 0 THEN COALESCE(QTD_MES_ANT, 0)
        ELSE QTD_FINAL
    END AS QTD_FINAL,
    QTD_ENTRADA,
    QTD_SAIDA,
    CASE
        WHEN QTD_ENTRADA = 0 AND QTD_SAIDA = 0 AND COALESCE(QTD_MES_ANT, 0) = 0 THEN 'SEM MOVIMENTO'
        ELSE 'MOVIMENTO OK'
    END AS MOVIMENTO
FROM CTE_ESTOQUE
ORDER BY ANO_REF, MES_REF;


A função LAG permite acessar a linha anterior dentro da mesma partição de dados. Desta forma, você consegue buscar o saldo final do mês anterior (QTD_FINAL) para cada item. Na consulta principal, verificamos se não houve movimentação (QTD_ENTRADA = 0 AND QTD_SAIDA = 0). Se não houve movimentação, usamos o saldo final do mês anterior (QTD_MES_ANT). Se houve movimentação, usamos o saldo final atual (QTD_FINAL)

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

WITH CTE_ESTOQUE AS (

SELECT

COD_EMPRESA,

COD_ITEM,

MES_REF,

ANO_REF,

QTD_ENTRADA,

QTD_SAIDA,

QTD_MES_ANT,

LAG(QTD_MES_ANT) OVER (PARTITION BY COD_EMPRESA, COD_ITEM ORDER BY ANO_REF, MES_REF) AS QTD_MES_ANT_LAG

FROM DW_ESTOQUE_HIST

WHERE ANO_REF IN ('2023', '2024')

AND COD_ITEM = 'EXP.E78'

AND COD_EMPRESA = '01'

)

SELECT

COD_EMPRESA,

COD_ITEM,

MES_REF,

ANO_REF,

CASE

WHEN QTD_ENTRADA = 0 AND QTD_SAIDA = 0 THEN COALESCE(QTD_MES_ANT_LAG, 0)

ELSE QTD_MES_ANT

END AS QTD_FINAL,

QTD_ENTRADA,

QTD_SAIDA,

CASE

WHEN QTD_ENTRADA = 0 AND QTD_SAIDA = 0 AND COALESCE(QTD_MES_ANT_LAG, 0) = 0 THEN 'SEM MOVIMENTO'

ELSE 'MOVIMENTO OK'

END AS MOVIMENTO

FROM CTE_ESTOQUE

ORDER BY ANO_REF, MES_REF;

image.png.a640a34e65e5b6e0eef473b3a87a8c19.png


NESSE SCRIPT ELE TRAZ da mesma forma da anterior, esse item de exemplo, como a ultima movimentação fou uma entrada 2530 no mes 4, ele so puxa o saldo de 45550 até o mes 4, precisava de alguma forma replicar para os proximos meses até que tenha uma nova movimentação. 

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...