› Fóruns › SQL e PL/SQL › O que ha de errado nessa function? Nao acumula valor › O que ha de errado nessa function? Nao acumula valor
Olá Marcio,
Acho que você já fez essa mesma pergunta várias vezes, sempre disfarçada de uma pergunta nova. O problema não é que as pessoas não saibam ou não queiram ajudar, é que você precisa facilitar para que nós possamos entender a lógica que você necessita.
Faça de conta que você não conhece nada sobre o seu problema atual e releia a questão. Você entenderia claramente aonde ela está querendo chegar?
Indo ao ponto, você precisa dar exemplo dos dados de entrada (tabelas do seu sistema que estão envolvidas, e dados delas) e a forma que você espera enxergar os dados na saída. Um exemplo pequeno mas que sirva para que validemos a nossa proposta de solução de acordo com a lógica que você pediu.
Bom, juntando um pouco do que consegui entender, o problema no momento está sendo acumular valores ao longo dos meses.
A função SUM faz somatório com acumulação incrementando, segue um exemplo:
SQL> create table clanca (conta number(10),
2 data_lanc date,
3 credito number(10, 2),
4 debito number(10, 2),
5 valor number(10, 2));
Table created
SQL> begin
2 insert into clanca (conta, data_lanc, credito, debito, valor)
3 values (100, to_date('05/01/2010', 'DD/MM/YYYY'), 1, null, 2000);
4 insert into clanca (conta, data_lanc, credito, debito, valor)
5 values (100, to_date('08/01/2010', 'DD/MM/YYYY'), null, 1, 500);
6 insert into clanca (conta, data_lanc, credito, debito, valor)
7 values (100, to_date('01/02/2010', 'DD/MM/YYYY'), 1, null, 2000);
8 insert into clanca (conta, data_lanc, credito, debito, valor)
9 values (100, to_date('02/02/2010', 'DD/MM/YYYY'), null, 1, 500);
10 insert into clanca (conta, data_lanc, credito, debito, valor)
11 values (100, to_date('20/03/2010', 'DD/MM/YYYY'), null, 1, 500);
12 insert into clanca (conta, data_lanc, credito, debito, valor)
13 values (200, to_date('25/01/2010', 'DD/MM/YYYY'), 1, null, 2000);
14 insert into clanca (conta, data_lanc, credito, debito, valor)
15 values (200, to_date('01/02/2010', 'DD/MM/YYYY'), null, 1, 500);
16 insert into clanca (conta, data_lanc, credito, debito, valor)
17 values (200, to_date('01/02/2010', 'DD/MM/YYYY'), 1, null, 2000);
18 insert into clanca (conta, data_lanc, credito, debito, valor)
19 values (200, to_date('01/03/2010', 'DD/MM/YYYY'), null, 1, 500);
20 insert into clanca (conta, data_lanc, credito, debito, valor)
21 values (200, to_date('20/04/2010', 'DD/MM/YYYY'), null, 1, 500);
22 commit;
23 end;
24 /
PL/SQL procedure successfully completed
SQL> select conta,
2 ano,
3 mes,
4 movim_liquido_mes,
5 valor_acumulado_ano
6 from (select conta,
7 to_char(data_lanc, 'YYYY') ano,
8 to_char(data_lanc, 'MM') mes,
9 sum(case when debito is not null then valor * -1
10 when credito is not null then valor end) movim_liquido_mes,
11 sum(sum(case when debito is not null then valor * -1
12 when credito is not null then valor end))
13 over (partition by conta, to_char(data_lanc, 'YYYY') order by to_char(data_lanc, 'MM') asc) valor_acumulado_ano
14 from clanca
15 group by conta, to_char(data_lanc, 'MM'), to_char(data_lanc, 'YYYY'));
CONTA ANO MES MOVIM_LIQUIDO_MES VALOR_ACUMULADO_ANO
100 2010 01 1500 1500
100 2010 02 1500 3000
100 2010 03 -500 2500
200 2010 01 2000 2000
200 2010 02 1500 3500
200 2010 03 -500 3000
200 2010 04 -500 2500
7 rows selected
SQL>
A documentação Oracle tem mais detalhes, se você quiser ler fica na url abaixo:
http://download.oracle.com/docs/cd/E118 … ons004.htm