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

#94367
fsitja
Participante

    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