Inquiridor
Composição de Saldo [SQL 2000]

Pergunta
-
Pessoal,
Estou montando um tipo de extrato de conta corrente. Numa das colunas eu tenho o Valor e na outra, o Saldo, que é composto por cada movimento da conta corrente. Quando selecionei os registros, criei uma tabela temporária, sendo que a coluna de Saldo deixei nula.
Para montar o saldo, eu costumo criar um cursor e somando o valor de cada linha e atualizando o saldo a cada movimento.
Minha pergunta é: tem um jeito de montar esse saldo através de um único select, sem precisar fazer um cursor e somar linha por linha?
Obrigado,
Jorge Pregnolato Filho.
sexta-feira, 2 de fevereiro de 2007 18:44
Todas as Respostas
-
Boa tarde Jorge
Você pode enviar um exemplo ?
Abs
sexta-feira, 2 de fevereiro de 2007 18:52 -
Jorge,
Em um sistema que eu desenvolvi aqui na empresa, temos um relatório(ficha de movimentação) que trabalhar como se fosse um extrato, colunas de entrada, colunas de saída, saldo diário, saldo final.
Será que é mais ou menos isso que você precisa?
sexta-feira, 2 de fevereiro de 2007 19:00 -
Boa tarde Jorge, consegui implementar da seguinte forma, dá uma olhada e vê se isso te ajuda.
Declare @Tabela Table(Item int identity(1,1),Valor decimal(15,2),Saldo Decimal(15,2))
Declare @Tabela_Saida Table(Item int identity(1,1),Valor decimal(15,2),Saldo Decimal(15,2))INSERT INTO @Tabela Values(0,Null)
INSERT INTO @Tabela Values(10,Null)
INSERT INTO @Tabela Values(20,Null)
INSERT INTO @Tabela Values(30,Null)
INSERT INTO @Tabela Values(40,Null)
INSERT INTO @Tabela Values(50,Null)
INSERT INTO @Tabela Values(60,Null)
INSERT INTO @Tabela Values(70,Null)
INSERT INTO @Tabela Values(80,Null)
INSERT INTO @Tabela Values(90,Null)Insert into @Tabela_Saida Select valor,saldo From @Tabela
Declare @Qtd int,
@Reg int,
@Saldo decimal(15,2)Select @Qtd = Count(*) From @Tabela
Select @Reg = 1Select @Saldo = 0
While @Reg <= @Qtd
begin
Update @Tabela_Saida Set Saldo=Valor+ @Saldo where item=@RegSet @Saldo = (Select Valor+@Saldo From @Tabela Where item=@Reg)
Set @Reg = @Reg + 1
endSelect * from @Tabela_Saida
Espero ter ajudado
sexta-feira, 2 de fevereiro de 2007 19:10 -
Jorge, completando o raciocínio:
Antes do SELECT final do exemplo que te passei vc poderia Truncar a tabela e atualizar os valores com os dados da tabela de saída.
sexta-feira, 2 de fevereiro de 2007 19:21 -
Anderson,
É justamente a utilização do While que eu quero evitar. Eu gostaria de compor o saldo através de um único select. Mas, acho que não deve ser possível, pois teriamos que gerar uma acumulação numa variável, dentro de um select e ainda por cima gravar o que encontrou.
Obrigado,
Jorge.
sexta-feira, 2 de fevereiro de 2007 19:28 -
Junior,
É isso mesmo. Eu também já fiz relatórios desse tipo, mas usei um while end para acumular o saldo. É isso que eu gostaria de evitar, se fosse possível,
Jorge.
sexta-feira, 2 de fevereiro de 2007 19:29 -
Bom dia Jorge,
Creio que ainda dá para dar uma enxugada neste exemplo que te passei, mas apesar do While, não existe cursor.
Espero ter ajudado
Abraços
segunda-feira, 5 de fevereiro de 2007 10:24 -
Olá Jorge.
Dá uma olhada no código abaixo, e ve se te ajuda..
Qualquer coisa escreve de novo.
create table tbl_creditos(
data datetime
,nome varchar(20)
,conta int
,qtd int)insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,10)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,12)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,7)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,-5)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,2)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,10)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,5)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,7)if(object_id('tempdb..#tbl')is not null)
drop table #tblselect *, idrow=identity(int,1,1) into #tbl
from tbl_creditosselect nome, qtd, saldo=(select sum(p.qtd) from #tbl p
where p.idrow <= q.idrow and q.nome = p.nome)
from #tbl q
group by nome, q.idrow, qtdquarta-feira, 7 de fevereiro de 2007 01:16 -
Olá pessoal. Estou com uma dúvida referente a essa questão de saldo e gostaria de compartilhar com vocês para saber se alguém pode me auxiliar a resolver.
Eu criei uma procedure para retornar um extrato da conta "corrente" e 2 saldos... Eu usei o union all, assim dessa forma o saldo que está numa tabela de saldo somente será mostrado na primeira linha... as demais linha eu preciso trazer o saldo de acordo com a transação, Crédito ou Débito da conta... ou seja um valor de saldo acumulado.
Exemplo: (DESCRIÇÃO) VR_MOVIMENTO SALDO1 SALDO2
LINHA 1: SALDO ANTERIOR - 10000,00 5000,00LINHA 2: PAGAMENTO DE ENERGIA 100,00 9900,00 4900,00
LINHA 3: RECEBIMENTO DE VENDA 500,00 10400,00 5400,00
Esses saldos 1 e 2 são acumulativos...
Vocês têm alguma idéia de como resolver esse problema dentro do SQL Server modificando minha procedure?
A solução mais próxima que encontrei foi a seguinte...
TENHO 2 VARIÁVEIS @SALDO1 E @SALDO2
Que jogo nelas através de um select esses saldo anteriors...
As demais linhas deveriam ser: SALDO1 = SALDO1 + VR_MOVIMENTO (EM CASO DE CRÉDITO) E EM CÁSO DE DÉBITO SALDO1=SALDO1+VR_MOVIMENTO.
Se alguém puder me ajudar ficaria grato.
Att
Charles
Olá Jorge.Dá uma olhada no código abaixo, e ve se te ajuda..
Qualquer coisa escreve de novo.
create table tbl_creditos(
data datetime
,nome varchar(20)
,conta int
,qtd int)insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,10)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,12)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,7)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,-5)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,2)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,10)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,5)
insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,7)if(object_id('tempdb..#tbl')is not null)
drop table #tblselect *, idrow=identity(int,1,1) into #tbl
from tbl_creditosselect nome, qtd, saldo=(select sum(p.qtd) from #tbl p
where p.idrow <= q.idrow and q.nome = p.nome)
from #tbl q
group by nome, q.idrow, qtd
Charles Tempo Rochasexta-feira, 18 de setembro de 2009 14:53