Pessoal, boa tarde, tudo bem ?
Estou com um problema aqui e gostaria da opinião de vocês e se possível, da 
ajuda de vocês... Eu tenho uma tabela, que tem registros que o range deles são 
próximos, e caso uma determinada coluna seja igual, eu preciso agrupar eles. 
Por exemplo:
inicial - final - prazo
01 - 09 - 0210 - 19 - 0320 - 29 - 03
Nesse exemplo acima, o primeiro registro, o campo final é 9, se eu somar + 1, 
será o campo inicial do segundo registro, porém, o prazo do primeiro registro é 
2 e o prazo do segundo registro é 3. Nesse caso, eu não agrupo, pego a primeira 
linha e insiro na segunda tabela.. Já o segundo registro, o campo final é 19, 
se eu somar + 1, dará o valor do campo inicial do terceiro registro e como os 
prazos são iguais (3), eu devo agrupar eles e inserir eles na segunda tabela, 
ficando assim o resultado:
inicial - final - prazo
01 - 09 - 0210 - 29 - 03
Quando tem que agrupar, estou tendo dificuldade... Abaixo estou colocando os 
script's para melhor entendimento.

create table tabela (inicio number(8) not null,                     fim 
number(8) not null,                     prazo number(3) not null);
  create table tabela_agrupada (inicio number(8) not null,                      
        fim number(8) not null,                              prazo number(3) 
not null);

insert into tabela(inicio, fim, prazo) values(1000000, 1000005, 5);insert into 
tabela(inicio, fim, prazo) values(510101, 510104, 4);insert into tabela(inicio, 
fim, prazo) values(510000, 510067, 4);insert into tabela(inicio, fim, prazo) 
values(510068, 510100, 3);insert into tabela(inicio, fim, prazo) 
values(1000006, 10000010, 5);insert into tabela(inicio, fim, prazo) 
values(810000, 810001, 5);insert into tabela(inicio, fim, prazo) values(810002, 
810003, 5);insert into tabela(inicio, fim, prazo) values(810004, 810005, 5);    
declare   v_inicio number(8);  v_fim number(8);  v_prazo number(3);  
v_prx_inicio number(8);  v_prx_fim number(8);  v_prx_prazo number(3);  v_existe 
number(8);

declare c1 cursor is  select t.inicio,         t.fim,         t.prazo,         
lead(t.inicio - 1) over (order by t.inicio) prx_inicio,         lead(t.fim) 
over (order by t.fim) prx_fim,         lead(t.prazo) over (order by t.prazo) 
prx_prazo  from tabela t  order by t.inicio,           t.fim,           t.prazo;
open c1;
loop
  fetch c1  into v_inicio,       v_fim,       v_prazo,       v_prx_inicio,      
 v_prx_fim,       v_prx_prazo;          exit when c1%notfound      if (v_prazo 
= v_prx_prazo) and (v_fim = v_prx_inicio)            begin
                update tabela_agrupada set fim = v_prx_fim where inicio = 
v_inicio
            end;        else            begin
                insert into tabela_agrupada(inicio, fim, prazo) values 
v_inicio, v_fim, v_prazo;
            end;
end loop;
close c1;
select * from tabela_agrupada
Para o script acima, o resultado deverá ser:
inicio - fim - prazo
1000000 - 10000010 - 5510101 - 510104 - 4510000 - 510067 - 4510068 - 510100 - 
3810000 - 810005 - 5
[ ]s
  • [oracle_br] [PL/... Tiago de Assis Pimenta tiagopime...@ymail.com [oracle_br]

Responder a