Pular para o conteúdo

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

#94559
fsitja
Participante

    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.