› 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
Opa, testa o seguinte e vê se é mais ou menos isso:
SQL> create table cconta (codconta varchar2(11) primary key,
2 descricao varchar2(40));
Table created
SQL> create table saldo (codconta varchar2(11),
2 data_saldo date,
3 val_saldo number(10,2));
Table created
SQL> create table clanca (conta varchar2(11) references cconta(codconta),
2 data_lanc date,
3 credito number(10, 2),
4 debito number(10, 2),
5 valor number(10, 2));
Table created
SQL> begin
2 -- inserts de contas
3 insert into cconta (codconta, descricao) values (1, '1.0.0');
4 insert into cconta (codconta, descricao) values (2, '2.0.0');
5 insert into cconta (codconta, descricao) values (11, '1.1.0');
6 insert into cconta (codconta, descricao) values (12, '1.2.0');
7 insert into cconta (codconta, descricao) values (111, '1.1.1');
8 insert into cconta (codconta, descricao) values (112, '1.1.2');
9 insert into cconta (codconta, descricao) values (21, '2.1.0');
10 insert into cconta (codconta, descricao) values (211, '2.1.1');
11 -- inserts de saldo
12 insert into saldo (codconta, data_saldo, val_saldo)
13 values (111, to_date('31/12/2009', 'DD/MM/YYYY'), 5000);
14 insert into saldo (codconta, data_saldo, val_saldo)
15 values (12, to_date('31/12/2009', 'DD/MM/YYYY'), 2000);
16 insert into saldo (codconta, data_saldo, val_saldo)
17 values (2, to_date('31/12/2009', 'DD/MM/YYYY'), 1000);
18 -- inserts de lancamentos
19 insert into clanca (conta, data_lanc, credito, debito, valor)
20 values (11, to_date('05/01/2010', 'DD/MM/YYYY'), 1, null, 20000);
21 insert into clanca (conta, data_lanc, credito, debito, valor)
22 values (11, to_date('08/01/2010', 'DD/MM/YYYY'), null, 1, 50000);
23 insert into clanca (conta, data_lanc, credito, debito, valor)
24 values (11, to_date('01/02/2010', 'DD/MM/YYYY'), 1, null, 80000);
25 insert into clanca (conta, data_lanc, credito, debito, valor)
26 values (11, to_date('02/02/2010', 'DD/MM/YYYY'), null, 1, 130000);
27 insert into clanca (conta, data_lanc, credito, debito, valor)
28 values (11, to_date('20/03/2010', 'DD/MM/YYYY'), null, 1, 40000);
29 insert into clanca (conta, data_lanc, credito, debito, valor)
30 values (111, to_date('10/02/2010', 'DD/MM/YYYY'), 1, null, 20000);
31 insert into clanca (conta, data_lanc, credito, debito, valor)
32 values (112, to_date('20/03/2010', 'DD/MM/YYYY'), null, 1, 10000);
33 insert into clanca (conta, data_lanc, credito, debito, valor)
34 values (12, to_date('25/01/2010', 'DD/MM/YYYY'), 1, null, 3000);
35 insert into clanca (conta, data_lanc, credito, debito, valor)
36 values (12, to_date('01/02/2010', 'DD/MM/YYYY'), null, 1, 1000);
37 insert into clanca (conta, data_lanc, credito, debito, valor)
38 values (12, to_date('01/02/2010', 'DD/MM/YYYY'), 1, null, 5000);
39 insert into clanca (conta, data_lanc, credito, debito, valor)
40 values (12, to_date('01/03/2010', 'DD/MM/YYYY'), null, 1, 7000);
41 insert into clanca (conta, data_lanc, credito, debito, valor)
42 values (12, to_date('20/03/2010', 'DD/MM/YYYY'), null, 1, 5000);
43 insert into clanca (conta, data_lanc, credito, debito, valor)
44 values (2, to_date('20/01/2010', 'DD/MM/YYYY'), 1, null, 100);
45 insert into clanca (conta, data_lanc, credito, debito, valor)
46 values (21, to_date('20/01/2010', 'DD/MM/YYYY'), 1, null, 200);
47 insert into clanca (conta, data_lanc, credito, debito, valor)
48 values (211, to_date('20/01/2010', 'DD/MM/YYYY'), 1, null, 300);
49 commit;
50 end;
51 /
PL/SQL procedure successfully completed
SQL> with mov_mensal as (
2 select codconta,
3 nivel1,
4 nivel2,
5 nivel3,
6 ano,
7 nvl(sum(case when mes = '12' and ano = (2010 - 1) then mov_liq_mes end), 0) saldo_ant,
8 nvl(sum(case when mes <= '01' then mov_liq_mes end), 0) jan,
9 nvl(sum(case when mes <= '02' then mov_liq_mes end), 0) fev,
10 nvl(sum(case when mes <= '03' then mov_liq_mes end), 0) mar,
11 nvl(sum(case when mes
Só tem que ver como que está armazenado o saldo na sua tabela de saldo. Eu coloquei uma coluna “data_saldo” lá para guardar a data do final do ano de 2009, com a data de 31/12/2009. A solução foi feita pensando nisso.
Talvez dependendo de como for sua tabela, tenha que mexer no CASE para a coluna de SALDO_ANT e algumas outras coisinhas.