Problema com query. trazer saldo em coluna

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Pessoal, boa tarde!

Estou com um grande problema. tenho que fazer uma query onde pega a movimentação do estoque e na ultima coluna mostrar o saldo. linha a linha.

ex:

Selecionar tudo

produto   |  quantidade   |   saldo
60006          188             188
60006           -8             180
60006          -80             100.
**onde o valor positivo indica a entrada de produto e o negativo saída.

Já tentei usar case para realizar a conta mas não da certo. alguém pode me ajudar?

valeu
FernandesRE
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qui, 08 Jan 2015 9:22 pm

Tudo bem Douglas?

Tenta assim:

Selecionar tudo

select produto, quantidade,
sum(quantidade) OVER (partition BY produto ORDER BY rownum ) saldo
from produto 
order by produto
Você pode alterar a coluna do order by (...ORDER BY rownum...) eu deixei o Rownum, mas imagino que vai preferir alguma data da tabela.

[]s
Rodrigo
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Selecionar tudo

CREATE TABLE THOMAS1( produto number, ordem number, quantidade number);
INSERT INTO thomas1 VALUES (60006, 1, 188);
INSERT INTO thomas1 VALUES (60006, 2,  -8);
INSERT INTO thomas1 VALUES (60006, 3, -80);
To usando o campo ORDEM pra definir qual ordem vai somar.

Selecionar tudo

select 
  produto
, ordem
, quantidade  
, SUM(quantidade) over (partition by null order by ordem)  ant
from thomas1
Saida:

Selecionar tudo

   PRODUTO      ORDEM QUANTIDADE        ANT
---------- ---------- ---------- ----------
     60006          1        188        188
     60006          2         -8        180
     60006          3        -80        100
 
SQL> 
Leia esse documento pra aprender mais sobre funções analíticas:
https://glufke.net/oracle/download/funco ... TICAS.html
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

OPS, agora que eu vi que o FernandesRE já tinha respondido :oops:
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Bom dia galera....

valeu pela ajuda, quando chegar no meu trabalho vou testar.

Depois posto o resultado aqui.. :lol:
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Pessoal deu quase certo.mas devo estar fazendo algo de errado para os valores não bater. Vou postar meu código aqui. assim fica melhor de entender.

Selecionar tudo

SELECT data
            , documento
            , ds_produto produto
            , ds_unidade unidade
            , operacao
            , quantidade
            , ds_estoque estoque_origem
            , Upper(ds_destino) estoque_destino
            ,SUM(quantidade) OVER (PARTITION BY NULL ORDER BY DATA)SALDO 
  FROM (

-----------------------------CONTAGENS DE ESTOQUE----------------------------------------------------------------------

SELECT  
   Itcontagem.Cd_produto Cd_produto
  ,Produto.Ds_produto Ds_produto
  ,dbamv.verif_ds_unid_prod(ITCONTAGEM.CD_PRODUTO) Ds_unidade
  ,Sum(( Nvl(Itcontagem.Qt_estoque,0) +
   Nvl( Itcontagem.Qt_estoque_doado,0) +
   Nvl(Itcontagem.Qt_Kit,0) ) * UNI_PRO.VL_FATOR ) / dbamv.verif_vl_fator_prod(ITCONTAGEM.CD_PRODUTO) Quantidade
  ,Trunc(Contagem.Dt_geracao) Data
  ,Contagem.Hr_geracao Hora
  ,Contagem.Cd_contagem Documento
  ,'Contagem - ' || Estoque.Ds_estoque Ds_destino
  ,'Contagem' Operacao
  ,0 Valor
  ,Estoque.Cd_estoque Cd_estoque
  ,Estoque.Ds_estoque Ds_estoque
  ,dbamv.verif_vl_fator_prod(ITCONTAGEM.CD_PRODUTO) Vl_fator
  ,'1' Tp_ordem
  ,'N' Sn_consignado
  ,Produto.Sn_Consignado Produto_Sn_Consig
  FROM 
      Dbamv.Itcontagem  Itcontagem
     ,Dbamv.Contagem    Contagem
     ,Dbamv.Produto     Produto
     ,Dbamv.Uni_pro     Uni_pro
     ,Dbamv.Estoque     Estoque
                WHERE
    Trunc(contagem.dt_geracao) BETWEEN To_Date('27/12/2014','dd/mm/yyyy') AND To_Date('31/12/2014','dd/mm/yyyy')
AND produto.cd_produto  IN(104010,104011,101001,199513,113002,105001,112014,116006,113014,113010,310006,106052,112015,103018,112013,110005,300018,130001,106061,222016,140006,300020, 111023,102020,132004,102003,102013,106037,102014,102004,102010,102011,199433,199430,199336)     
 AND estoque.cd_estoque = 1
AND Itcontagem.Cd_produto    = Produto.Cd_produto
AND Itcontagem.Cd_contagem   = Contagem.Cd_contagem
AND Itcontagem.Cd_uni_pro    = Uni_pro.Cd_uni_pro
AND Contagem.Cd_estoque      = Estoque.Cd_estoque
AND Estoque.Cd_Multi_empresa = 3
AND CONTAGEM.TP_CONTAGEM IN ( 'G', 'S' )
AND PRODUTO.cd_produto       = 130001
GROUP BY Itcontagem.Cd_produto, Produto.Ds_produto, Produto.Vl_custo_medio, dbamv.verif_ds_unid_prod(ITCONTAGEM.CD_PRODUTO), Contagem.Dt_geracao, Contagem.Hr_geracao
        ,Contagem.Cd_contagem,Estoque.Cd_estoque,Estoque.Ds_estoque,dbamv.verif_vl_fator_prod(ITCONTAGEM.CD_PRODUTO),Produto.Sn_Consignado

UNION ALL

-----------------------------MOVIMENTAÇÕES DE ESTOQUE----------------------------------------------------------------------

SELECT 
      Itmvto_estoque.Cd_produto cd_produto
     ,Produto.Ds_produto ds_produto
     ,VERIF_DS_UNID_PROD(Itmvto_estoque.Cd_produto ) Ds_Unidade
     ,Sum(Decode( Mvto_estoque.Tp_mvto_estoque,'D', Itmvto_estoque.Qt_movimentacao,'C' , Itmvto_estoque.Qt_movimentacao,
      Itmvto_estoque.Qt_movimentacao * -1 ) * uni_pro.vl_fator/
      dbamv.VERIF_VL_FATOR_PROD(itmvto_estoque.cd_produto))  Quantidade
     ,Trunc(Mvto_estoque.Dt_mvto_estoque) Data
     ,Mvto_estoque.Hr_mvto_estoque Hora
     ,Mvto_estoque.Cd_mvto_estoque Documento
     ,Initcap(Nvl( Paciente.Nm_paciente,
      Decode(Mvto_estoque.Tp_mvto_estoque, 'T', Estoque_destino.Ds_estoque, 'B', 'Tombamento Patrimonio','E',Fornecedor.Nm_fornecedor, Setor.Nm_setor ) ) ) Ds_destino
     ,Initcap(Decode( Mvto_estoque.Tp_mvto_estoque,
               'X', 'Baixa De Produtos',
               'S', 'Saída Setor'   ,
               'B', 'Tombamento' ,
               'P', 'Saída Paciente'   ,
               'D', 'Devol. De Setor'  ,
               'C', 'Devol. De Paciente' ,
               'T', 'Transf. De Estoque ',
               'M', 'Manipul.  Produtos' ,
               'O', 'Doação  Produtos',
               'E', 'Saída De Empréstimo',
               'R','Transf. Empresas',
               'V', 'Venda De Produtos' ,
               'N','Devolução De Vendas')) Operacao
     ,0 Valor
     ,Estoque.Cd_estoque Cd_estoque
     ,Estoque.Ds_estoque Ds_estoque
     ,dbamv.VERIF_VL_FATOR_PROD(itmvto_estoque.cd_produto) Vl_fator
     ,'3' Tp_ordem
     ,'N' Sn_consignado
     ,Produto.Sn_Consignado Produto_Sn_Consig
                From Dbamv.Mvto_estoque   Mvto_estoque
     , Dbamv.Itmvto_estoque Itmvto_estoque
     , Dbamv.Produto        Produto
     , Dbamv.Uni_pro        Uni_pro
     , Dbamv.Atendime       Atendimento
     , Dbamv.Paciente       Paciente
     , Dbamv.Setor          Setor
     , Dbamv.Estoque        Estoque
     , Dbamv.Estoque        Estoque_destino
     , Dbamv.Fornecedor     Fornecedor
   Where Trunc(mvto_estoque.dt_mvto_estoque) BETWEEN To_Date('27/12/2014','dd/mm/yyyy') AND To_Date('31/12/2014','dd/mm/yyyy')
   AND produto.cd_produto  IN(104010,104011,101001,199513,113002,105001,112014,116006,113014,113010,310006,106052,112015,103018,112013,110005,300018,130001,106061,222016,140006,300020, 111023,102020,132004,102003,102013,106037,102014,102004,102010,102011,199433,199430,199336)     
   AND estoque.cd_estoque = 1
   And Itmvto_estoque.Cd_produto       = Produto.Cd_produto
   And Itmvto_estoque.Cd_mvto_estoque  = Mvto_estoque.Cd_mvto_estoque
   And Itmvto_estoque.Cd_uni_pro       = Uni_pro.Cd_uni_pro
   And Mvto_estoque.Cd_atendimento     = Atendimento.Cd_atendimento (+)
   And Atendimento.Cd_paciente         = Paciente.Cd_paciente (+)
   And Mvto_estoque.Cd_setor           = Setor.Cd_setor(+)
   And Mvto_estoque.Cd_estoque_destino =  Estoque_destino.Cd_estoque(+)
   And Itmvto_estoque.Cd_uni_pro       =  Uni_pro.Cd_uni_pro
   And Mvto_estoque.Cd_estoque         = Estoque.Cd_estoque
   And Mvto_estoque.Cd_fornecedor      = Fornecedor.Cd_fornecedor(+)
   And Estoque.Cd_Multi_empresa        = 3
   AND PRODUTO.cd_produto = 130001
GROUP BY Itmvto_estoque.Cd_produto
     , Produto.Ds_produto
     , VERIF_DS_UNID_PROD(Itmvto_estoque.Cd_produto )
     , Mvto_estoque.Dt_mvto_estoque
     , Mvto_estoque.Hr_mvto_estoque
     , Mvto_estoque.Cd_mvto_estoque
     , Initcap( Nvl( Paciente.Nm_paciente,
       Decode( Mvto_estoque.Tp_mvto_estoque, 'T', Estoque_destino.Ds_estoque, 'B', 'Tombamento Patrimonio','E',Fornecedor.Nm_fornecedor, Setor.Nm_setor ) ) )
     , Initcap( Decode( Mvto_estoque.Tp_mvto_estoque,
               'X', 'Baixa De Produtos',
               'S', 'Saída Setor'   ,
               'B', 'Tombamento' ,
               'P', 'Saída Paciente'   ,
               'D', 'Devol. De Setor'  ,
               'C', 'Devol. De Paciente' ,
               'T', 'Transf. De Estoque ',
               'M', 'Manipul.  Produtos' ,
               'O', 'Doação  Produtos',
               'E', 'Saída De Empréstimo',
               'R', 'Transf. Empresas',
               'V', 'Venda De Produtos' ,
               'N', 'Devolução De Vendas'))
     , Estoque.Cd_estoque
     , Estoque.Ds_estoque
     , dbamv.VERIF_VL_FATOR_PROD(itmvto_estoque.cd_produto)
     , Produto.Sn_Consignado
)ORDER BY data,produto, operacao ASC;
O resultado dessa query é o seguinte:

Selecionar tudo

DATA       DOC     PRODUTO        UNID    OPERACAO QUANT. EST. DESTINO            SALDO
27/12/2014 1432    BOLSA 6.4MM 	PECA 	Contagem 75     ALMOXARIFADO CENTRAL 	65
27/12/2014 5135912 BOLSA 6.4MM 	PECA 	Transf.  -10    FARMACIA SAT 5°         65
28/12/2014 5140055 BOLSA 6.4MM 	PECA 	Transf.  -4     FARMACIA SAT 2º P.S.    61
29/12/2014 5142633 BOLSA 6.4MM 	PECA 	Transf.  -15    FARMACIA SAT 5°         46
30/12/2014 5144307 BOLSA 6.4MM 	PECA 	Transf.  -5     FARMACIA SAT 2º P.S.    31
30/12/2014 5144283 BOLSA 6.4MM 	PECA 	Transf.  -10    FARMACIA SATELITE CC    31
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes