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

#94581
fsitja
Participante

    Eu tinha alterado várias outras coisas que no seu post acima ainda não estavam atualizadas, portanto não iria funcionar. Dá uma olhada abaixo e recomeça dali, pois tem algumas diferenças comparando com o que você tinha.

    Tenta o seguinte:

    with mov_mensal as (
    select codconta,
    nivel1,
    nivel2,
    nivel3,
    ano,
    nvl(sum(case when mes = '12' and ano = (2010 - 1) then mov_liq_mes end), 0) saldo_ant,
    nvl(sum(case when mes <= '01' then mov_liq_mes end), 0) jan,
    nvl(sum(case when mes <= '02' then mov_liq_mes end), 0) fev,
    nvl(sum(case when mes <= '03' then mov_liq_mes end), 0) mar,
    nvl(sum(case when mes <= '12' and ano = 2010 then mov_liq_mes end), 0) dez,
    nvl(sum(case when ano = 2010 then mov_liq_mes end), 0) tot_ano
    from (select c.codconta,
    substr(c.codconta, 1, 1) nivel1,
    substr(c.codconta, 1, 2) nivel2,
    substr(c.codconta, 1, 3) nivel3,
    to_char(data_lanc, 'YYYY') ano,
    to_char(data_lanc, 'MM') mes,
    sum(case when debito is not null then valor * -1
    when credito is not null then valor end) mov_liq_mes
    from (select rpad(codconta, 11, '0') codconta, descricao from cconta) c
    left join (select rpad(conta, 11, '0') codconta,
    l.data_lanc,
    l.valor,
    l.credito,
    l.debito
    from clanca l
    where to_char(l.data_lanc, 'YYYY') = 2010
    union
    all
    select rpad(s.codconta, 11, '0') codconta,
    to_date('31/12/' || (2010 - 1), 'DD/MM/YYYY') data_lanc,
    s.val_saldo valor,
    0 credito,
    null debito
    from saldo s) l on l.codconta = c.codconta
    group by c.codconta, to_char(data_lanc, 'MM'), to_char(data_lanc, 'YYYY'))
    group by codconta, nivel1, nivel2, nivel3, ano)
    -- end with
    select c.descricao, t.*
    from (select coalesce(nivel1, nivel2, nivel3) codconta,
    sum(saldo_ant) saldo_ant,
    sum(saldo_ant + jan) jan,
    sum(saldo_ant + fev) fev,
    sum(saldo_ant + mar) mar,
    sum(saldo_ant + dez) dez,
    sum(saldo_ant + tot_ano) saldo_final,
    sum(tot_ano) tot_ano
    from mov_mensal
    group by grouping sets ((nivel1), (nivel2), (nivel3))
    having (substr(nivel1, length(nivel1), 1) != '0')
    or (substr(nivel2, length(nivel2), 1) != '0')
    or (substr(nivel3, length(nivel3), 1) != '0')) t
    join cconta c on c.codconta = t.codconta
    where tot_ano != 0
    or saldo_ant != 0
    or jan != 0
    or fev != 0
    or mar != 0
    or dez != 0
    order by t.codconta;

    A união é para juntar o saldo aos lançamentos, como se ele fosse um lançamento “inicial” de crédito.

    Se continuar dando ORA-600, aí é algum bug na versão do Oracle que você está usando, geralmente tem correção no metalink para isso pois já deve ter sido identificado. No 11gR2 e no 10g (10.2.0.5.0) funciounou tranquilo.