none
Script SQL para soma de valor acumulado RRS feed

  • Pergunta

  • Necessito calcular o valor acumulado do saldo financeiro de produtos, onde possuo os campos :

    Código / Descrição / Saldo Físico / Custo Médio / Saldo financeiro.

    Alguém poderia me dar um help?

    Obrigada.

    quarta-feira, 19 de junho de 2013 19:51

Respostas

  • Rafaela

    não me atentei ao SUM :), acho que agora vai...

    ;with cte_dados as (
    SELECT DISTINCT         
            P.CODIGOPRD, 
            P.NOMEFANTASIA AS DESCRICAO,       
            L.SALDOFISICO2 AS SALDO_FISICO, 
            L.CUSTOMEDIO, 
            L.SALDOFISICO2 * L.CUSTOMEDIO AS SALDO_FINANCEIRO 
    FROM TPRD P, TPRDLOC L 
    WHERE P.INATIVO = 0 
           AND P.TIPO = 'P' 
           AND L.SALDOFISICO2 > 0 
           AND P.IDPRD = L.IDPRD 
           AND L.CODLOC = '007' 
    ), cte_dados2 as (select row_number() over(order by CODIGOPRD) as numerador, CODIGOPRD, DESCRICAO, SALDO_FISICO, CUSTOMEDIO, SALDO_FINANCEIRO from cte_dados)
    
    select *,
        isnull((select a.SALDO_FINANCEIRO + sum(b.SALDO_FINANCEIRO) from cte_dados2 b where numerador <= a.numerador-1),a.SALDO_FINANCEIRO) as SaldoAcumulado
    from cte_dados2 a
    


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Rafaela Alves quinta-feira, 20 de junho de 2013 19:46
    quinta-feira, 20 de junho de 2013 17:03
    Moderador

Todas as Respostas

  • Olá Rafaela

    Poderia fornecer um pouco mais de informação? se possivel crie um exemplo de como os dados estão em sua tabela e como vc deseja o resultado.

    Pelo que vc postou, imagino que um select com group by lhe atende...

    select Codigo, sum(Saldofinanceiro) from Tabela Group by Codigo


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 19 de junho de 2013 20:01
    Moderador
  • A questão é que eu necessito criar um relatório onde tenha o saldo acumulado linha a linha como no exemplo abaixo.


    Rafaela Alves

    quinta-feira, 20 de junho de 2013 11:37
  • Rafaela

    Existem algumas maneiras de se fazer... se estiver usando o SQL 2012 a forma mais simples é usando as Lead() e Lag(), no SQL 2008 vc pode usar o exemplo abaixo.

    declare @tbTeste as table (codigo varchar(14), descricao varchar(50), saldoFisico decimal(5,2), CustoMedio decimal(8,2), SaldoFinanceiro decimal(8,2))
    
    insert into @tbTeste values ('01.01.02.01155','Caixa Marcha Iveco Eurocargo 260e25', 1, 38626, 38626),
    ('01.02.01.01522','Kit Reparo Liebherr 934', 3, 6223.89, 18671.67),
    ('01.02.01.01568','Valvula Secundario', 6, 2915.99, 17495.94),
    ('01.02.01.00341','Turbina K27', 2, 8062.22, 16124.44),
    ('01.02.01.01764','Kit Anel Bomba', 4, 3828.11, 14112.44),
    ('01.01.03.00031','Pneu 175/70R14', 62, 224.24, 13902.88)
    
    
    ;with cte_dados as 
    (select row_number() over(order by codigo) as numerador, codigo, descricao, saldoFisico, CustoMedio, SaldoFinanceiro from @tbTeste)
    
    select *,
        isnull((select a.SaldoFinanceiro + b.SaldoFinanceiro from cte_dados b where numerador = a.numerador-1),a.SaldoFinanceiro) as SaldoAcumulado
    from cte_dados a


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 20 de junho de 2013 12:56
    Moderador
  • Desculpe, mas estou com um pouco de dificuldade para entender.

    Estou utilizando SQL 2005.

    No seu exemplo levou em consideração que os dados estavam todos em uma única tabela?

    Segue o meu Select que busca os dados, exceto o cálculo do Saldo Acumulado.

    SELECT DISTINCT P.CODIGOPRD,

            P.NOMEFANTASIA AS DESCRICAO,      

            L.SALDOFISICO2 AS SALDO_FISICO,

            L.CUSTOMEDIO,

            L.SALDOFISICO2 * L.CUSTOMEDIO AS SALDO_FINANCEIRO,

    FROM TPRD P, TPRDLOC L

    WHERE P.INATIVO = 0

           AND P.TIPO = 'P'

           AND L.SALDOFISICO2 > 0

           AND P.IDPRD = L.IDPRD

           AND L.CODLOC = '007'

    ORDER BY P.CODIGOPRD

    Obrigada pela atenção


    Rafaela Alves

    quinta-feira, 20 de junho de 2013 13:42
  • Olá rafaela

    Eu apenas criei a tabela para simular seus dados... mas seguindo o seu script ficaria +/- assim:

    ;with cte_dados as (
    SELECT DISTINCT         
            P.CODIGOPRD, 
            P.NOMEFANTASIA AS DESCRICAO,       
            L.SALDOFISICO2 AS SALDO_FISICO, 
            L.CUSTOMEDIO, 
            L.SALDOFISICO2 * L.CUSTOMEDIO AS SALDO_FINANCEIRO 
    FROM TPRD P, TPRDLOC L 
    WHERE P.INATIVO = 0 
           AND P.TIPO = 'P' 
           AND L.SALDOFISICO2 > 0 
           AND P.IDPRD = L.IDPRD 
           AND L.CODLOC = '007' 
    ), cte_dados2 as (select row_number() over(order by CODIGOPRD) as numerador, CODIGOPRD, DESCRICAO, SALDO_FISICO, CUSTOMEDIO, SALDO_FINANCEIRO from cte_dados)
    
    select *,
        isnull((select a.SALDO_FINANCEIRO + b.SALDO_FINANCEIRO from cte_dados2 b where numerador = a.numerador-1),a.SALDO_FINANCEIRO) as SaldoAcumulado
    from cte_dados2 a


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba


    quinta-feira, 20 de junho de 2013 14:08
    Moderador
  • Hola:

    Crea una tabla temporal con el primer resultado ordenado por lo que necesites y adicionalmente un campo saldo_acumulado numeric(12,2),  id int identity

    inserta en la tabla temporal la consulta

    haces un ciclo en la tabla temporal para ir llenado el campo saldo acumulado

    declare @tmp table (codigo varchar(20), descripcion varchar(100), saldo_fisico int, costo_medio numeric(12,2), saldo_financiero numeric(12,2), saldo_acumulado numeric(12,2) default 0, id int identity, listo bit default 0)

    declare @lccodigo varchar(20), @lnsaldo_financiero numeric(12,2), @lnsaldo_acumulado numeric(12,2)

    insert into @tmp ( codigo, descripcion, saldo_fisico, costo_medio, saldo_financiero)

    select codigo, descripcioin, saldo_fisico, costo_medio, saldo_financiero

    from tablas

    while exists ( select codigo from @tmp where listo = 0)

    begin

    select top 1 @lccodigo = codigo, @lnsaldo_financiero = saldo_financiero, @lnsaldo_acumulado = @lnsaldo_acumulado +  saldo_financiero

    from @tmp order by id

    update @tmp set saldo_acumulado = @lnsaldo_acumulado, listo = 1

    where codigo = @lccodigo

    end

    -- resultado final

    select codigo, descripcion, saldo_fisico, costo_medio, saldo_financiero, saldo_acumulado

    from @tmp

    order by codigo

    Petercito...

    quinta-feira, 20 de junho de 2013 14:32
  • Petercito

    esta é mais uma maneira se se atingir o objetivo, vale lembrar que neste seu modelo vc esta fazendo um acesso serializado aos dados... você poderá ter baixa performance neste modelo.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 20 de junho de 2013 14:43
    Moderador
  • Marcelo, essa planilha será utilizada para elaboração de curva ABC, então será pouco usada, então não me preocupei tanto de a  consulta ser um pouco mais lenta.

    No script que você colocou como exemplo quase chega ao resultado, o meu problema é que no segundo campo de valor acumulado eu não quero mais somar o saldo financeiro anterior com o próximo, eu já necessito calcular o saldo acumulado que foi calculado + o saldo financeiro da próxima linha.

    Tentei exemplicar na imagem abaixo:


    Rafaela Alves

    quinta-feira, 20 de junho de 2013 15:56
  • Rafaela

    não me atentei ao SUM :), acho que agora vai...

    ;with cte_dados as (
    SELECT DISTINCT         
            P.CODIGOPRD, 
            P.NOMEFANTASIA AS DESCRICAO,       
            L.SALDOFISICO2 AS SALDO_FISICO, 
            L.CUSTOMEDIO, 
            L.SALDOFISICO2 * L.CUSTOMEDIO AS SALDO_FINANCEIRO 
    FROM TPRD P, TPRDLOC L 
    WHERE P.INATIVO = 0 
           AND P.TIPO = 'P' 
           AND L.SALDOFISICO2 > 0 
           AND P.IDPRD = L.IDPRD 
           AND L.CODLOC = '007' 
    ), cte_dados2 as (select row_number() over(order by CODIGOPRD) as numerador, CODIGOPRD, DESCRICAO, SALDO_FISICO, CUSTOMEDIO, SALDO_FINANCEIRO from cte_dados)
    
    select *,
        isnull((select a.SALDO_FINANCEIRO + sum(b.SALDO_FINANCEIRO) from cte_dados2 b where numerador <= a.numerador-1),a.SALDO_FINANCEIRO) as SaldoAcumulado
    from cte_dados2 a
    


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Rafaela Alves quinta-feira, 20 de junho de 2013 19:46
    quinta-feira, 20 de junho de 2013 17:03
    Moderador
  • Marcelo,

    deu certinho, muito obrigada.

    Att,

    Rafaela Alves


    Rafaela Alves

    quinta-feira, 20 de junho de 2013 19:47
  • Nesta sintaxe, ajuste

    isnull((select a.SALDO_FINANCEIRO + b.SALDO_FINANCEIRO from cte_dados2 b where numerador = a.numerador-1),a.SALDO_FINANCEIRO) as SaldoAcumulado

    para

    isnull((select a.SALDO_FINANCEIRO + sum(b.SALDO_FINANCEIRO) from cte_dados2 b where numerador <= a.numerador-1),a.SALDO_FINANCEIRO) as SaldoAcumulado

    sábado, 25 de maio de 2019 00:41