Jump to content

Archived

This topic is now archived and is closed to further replies.

THIAGO MENGALI

Soma de valores em linhas diferentes

Recommended Posts

Pessoal,Vejam a seguinte situação que eu tenho:Item: Papel ToalhaMovimentação:Nota Fiscal Data Tipo Qtde Saldo000258122 01/02/2007 E 10 10000258144 02/02/2007 E 15 25000258256 05/02/2007 S 05 20000258963 01/02/2007 S 05 15000251258 01/02/2007 E 10 25Preciso que minha instrução SQL some ou subtraia o valor de cima, como mostrei no exemplo acima,se for E - Entrada, soma e se for S saída subtrai. Existe alguma forma de fazer isso?Por favor, é urgente!!!Thiago

Share this post


Link to post
Share on other sites

uma forma é usando o SUM combinando com o CASE

 

exemplo:

set nocount onset dateformat dmydeclare @tbMov table (NF varchar(10), Data datetime, Tipo char(1), Qtde int, Saldo int)insert into @tbMov(NF, Data, Tipo, Qtde, Saldo) values ('000258122', '01/02/2007', 'E', 10, 10)insert into @tbMov(NF, Data, Tipo, Qtde, Saldo) values ('000258144', '02/02/2007', 'E', 15, 25)insert into @tbMov(NF, Data, Tipo, Qtde, Saldo) values ('000258256', '05/02/2007', 'S', 05, 20)insert into @tbMov(NF, Data, Tipo, Qtde, Saldo) values ('000258963', '01/02/2007', 'S', 05, 15)insert into @tbMov(NF, Data, Tipo, Qtde, Saldo) values ('000251258', '01/02/2007', 'E', 10, 25)select sum(case when Tipo = 'E' then Qtde else 0 end) - sum(case when Tipo = 'S' then Qtde else 0 end) as Saldo from @tbMovselect sum(case when Tipo = 'E' then Qtde else 0 end) as Entrada from @tbMovselect sum(case when Tipo = 'S' then Qtde else 0 end) as Saida  from @tbMov
EDIT: mais simples ainda, deixando o campo 'Qtde' negativo se não for 'E'

select sum(case when Tipo = 'E' then Qtde else -Qtde end) as Saldo from @tbMov

Share this post


Link to post
Share on other sites

Mas, por exemplo, se eu tivesse 500 caras de E e 500 caras de S, eu teria que fazer um select para cada ou só com essas 3 instruções funcionaria?

só essa ja mata tudo
select sum(case when Tipo = 'E' then Qtde else -Qtde end) as Saldo from @tbMov
mas tipo, abre seu query analyser, copia essa bagaça ai que postei com tabela virtual local e executa só pra tu testar e sentir como funfa a paradafmzt++

Share this post


Link to post
Share on other sites

Até fiz isso, mas retorna apenas a soma de quando esta com E ou S, e preciso que a limnha de baixo seja a soma ou subtração da lionha de cima entende? cada linha depende da linha de cima...

Share this post


Link to post
Share on other sites

Meu camarada,Não consegui entender bem!Voce postou este exemplo:

Nota Fiscal Data Tipo Qtde Saldo000258122 01/02/2007 E 10 10000258144 02/02/2007 E 15 25000258256 05/02/2007 S 05 20000258963 01/02/2007 S 05 15000251258 01/02/2007 E 10 25

Que você quer com este dados? você quer consultá-los ou quer incluí-los?Posta a queyr que você esta utilizando para facilitar ajuda.t+

Até fiz isso, mas retorna apenas a soma de quando esta com E ou S, e preciso que a limnha de baixo seja a soma ou subtração da lionha de cima entende? cada linha depende da linha de cima...

Share this post


Link to post
Share on other sites

Até fiz isso, mas retorna apenas a soma de quando esta com E ou S, e preciso que a limnha de baixo seja a soma ou subtração da lionha de cima entende? cada linha depende da linha de cima...

ahhhh agora entendi (pelo menos "acho que entendi")... é que a primeira explicação deixava algumas dúvidas, imagino que em sua tabela não tenha essa coluna 'Saldo'uma possível solução para isto seria fazer um cursor ou loop e jogar os valores numa tabela virtual para consultaexemplo com cursor:
set nocount onset dateformat dmy-- imagino que sua tabela seja esta, sem a coluna saldodeclare @tbMov table (NF varchar(10), Data datetime, Tipo char(1), Qtde int)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258122', '01/02/2007', 'E', 10)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258144', '02/02/2007', 'E', 15)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258256', '05/02/2007', 'S', 05)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258963', '01/02/2007', 'S', 05)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000251258', '01/02/2007', 'E', 10)--variavel para calculo do saldodeclare @Saldo intset @Saldo = 0--tabela virtual p/ consulta, vamos adicionar a coluna saldodeclare @tbMovVirtual table (NF varchar(10), Data datetime, Tipo char(1), Qtde int, Saldo int)--cursor ydeclare y cursor for select NF, Data, Tipo, Qtde from @tbMov--variaveis para o cursor ydeclare @NF varchar(10), @Data datetime, @Tipo char(1), @Qtde intopen yfetch next from y into @NF, @Data, @Tipo, @Qtdewhile @@fetch_Status=0begin	if (@Tipo = 'E')		set @Saldo = @Saldo + @Qtde	else		set @Saldo = @Saldo - @Qtde			--inserindo na tabela virtual	insert into @tbMovVirtual(NF, Data, Tipo, Qtde, Saldo) values (@NF, @Data, @Tipo, @Qtde, @Saldo)		--loop do cursor y	fetch next from y into @NF, @Data, @Tipo, @Qtdeend--fim do cursor yclose ydeallocate y  --consultado a tabela virtual de consultaselect * from @tbMovVirtual

Share this post


Link to post
Share on other sites

É isso ai eriva_brse for no select só vejo cursores.Por isso perguntei, pois como não estava mto claro pensei que fosse no insert e controlar o saldo.t+

Até fiz isso, mas retorna apenas a soma de quando esta com E ou S, e preciso que a limnha de baixo seja a soma ou subtração da lionha de cima entende? cada linha depende da linha de cima...

ahhhh agora entendi (pelo menos "acho que entendi")... é que a primeira explicação deixava algumas dúvidas, imagino que em sua tabela não tenha essa coluna 'Saldo'uma possível solução para isto seria fazer um cursor ou loop e jogar os valores numa tabela virtual para consultaexemplo com cursor:
set nocount onset dateformat dmy-- imagino que sua tabela seja esta, sem a coluna saldodeclare @tbMov table (NF varchar(10), Data datetime, Tipo char(1), Qtde int)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258122', '01/02/2007', 'E', 10)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258144', '02/02/2007', 'E', 15)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258256', '05/02/2007', 'S', 05)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000258963', '01/02/2007', 'S', 05)insert into @tbMov(NF, Data, Tipo, Qtde) values ('000251258', '01/02/2007', 'E', 10)--variavel para calculo do saldodeclare @Saldo intset @Saldo = 0--tabela virtual p/ consulta, vamos adicionar a coluna saldodeclare @tbMovVirtual table (NF varchar(10), Data datetime, Tipo char(1), Qtde int, Saldo int)--cursor ydeclare y cursor for select NF, Data, Tipo, Qtde from @tbMov--variaveis para o cursor ydeclare @NF varchar(10), @Data datetime, @Tipo char(1), @Qtde intopen yfetch next from y into @NF, @Data, @Tipo, @Qtdewhile @@fetch_Status=0begin	if (@Tipo = 'E')		set @Saldo = @Saldo + @Qtde	else		set @Saldo = @Saldo - @Qtde			--inserindo na tabela virtual	insert into @tbMovVirtual(NF, Data, Tipo, Qtde, Saldo) values (@NF, @Data, @Tipo, @Qtde, @Saldo)		--loop do cursor y	fetch next from y into @NF, @Data, @Tipo, @Qtdeend--fim do cursor yclose ydeallocate y  --consultado a tabela virtual de consultaselect * from @tbMovVirtual

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.