› 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
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.