Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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++

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.