Usuário com melhor resposta
Script SQL para soma de valor acumulado

Pergunta
-
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
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- Sugerido como Resposta Eduardo Gomes Pereira quinta-feira, 20 de junho de 2013 11:34
-
-
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- Sugerido como Resposta Advaldo Mesquita Moreira Junior quinta-feira, 20 de junho de 2013 13:36
-
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
-
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- Editado Marcelo Fernandes da SilvaMVP, Moderator quinta-feira, 20 de junho de 2013 14:08 ortografia
-
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...
-
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 -
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
- Sugerido como Resposta JonimarArturRadtke sábado, 25 de maio de 2019 00:40
-
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
-
-
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