sexta-feira, 5 de fevereiro de 2010

Campo com valor acumulado em SQL











Suponha que queira uma coluna calculada como no exemplo abaixo:


Que ele calcule o acumulado dos dias (datas) anteriores, além dele próprio:


+----------------------------+
| data  | valor | acumulado  |
+----------------------------+
|   1   |   5   |     5      |
|   2   |   7   |    12      |
|   2   |   7   |    19      |
+----------------------------+



Fazendo campo acumulado


-- criamos a tabela temporária
drop table #teste
create table #teste (
 data int,
 valor int,
 ac int,
)

-- carregamos o exemplo

insert into #teste values(1,9,null)
insert into #teste values(2,10,null)
insert into #teste values(3,11,null)
insert into #teste values(4,14,null)


-- atualizamos o campo "ac" com a soma com valores com a data anterior.


update #teste
set ac = (select sum(valor) from #teste where data <= a.data)
from #teste a


/*
O update acima diz o seguinte:


atualize o campo ac do primeiro registro, com o subselect, onde o subselect é a soma
de todos os valores que tenham a data (da tabela #teste so subselect) igual, ou menor que a data
da tabela #teste externa


*/


-- verificamos o resultado

select * from #teste

Dúvidas ou curiosidade, me perguntem!

Nenhum comentário :