Concatenar valor com valor de linhas anteriores?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Olá Pessoal,
Usando Select, é possível fazer uma função cumulativa de valores baseado nas LINHAS anteriores?, ex:

Selecionar tudo

Coluna A     Coluna B (cumulativa)
João         João       
Alex         João, Alex
Sara         João, Alex, Sara
José         João, Alex, Sara, José
Ainda não definimos o ponto de quebra para recomeçar o processo, ainda estou vendo isso.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tabela de teste:

Selecionar tudo

create table thomas (name varchar2(100) );

begin
insert into thomas values ('Joao');
insert into thomas values ('Alex');
insert into thomas values ('Sara');
insert into thomas values ('Jose');
insert into thomas values ('Thomas');
end;
Daí eu fiz essa query: No caso, eu sei que pode ter no máximo 5 nomes.

Selecionar tudo

select 
  name
,  lag (name||', ',5,null) over (order by name ) 
|| lag (name||', ',4,null) over (order by name ) 
|| lag (name||', ',3,null) over (order by name )  
|| lag (name||', ',2,null) over (order by name ) 
|| lag (name||', ',1,null) over (order by name ) 
|| lag (name||', ',0,null) over (order by name ) a
from thomas
order by name;
Resultado:

Selecionar tudo

SQL> select
  2    name
  3  ,  lag (name||', ',5,null) over (order by name )
  4  || lag (name||', ',4,null) over (order by name )
  5  || lag (name||', ',3,null) over (order by name )
  6  || lag (name||', ',2,null) over (order by name )
  7  || lag (name||', ',1,null) over (order by name )
  8  || lag (name||', ',0,null) over (order by name ) a
  9  from thomas
 10  order by name;
 

NAME       A
---------- --------------------------------
Alex       Alex,
Joao       Alex, Joao,
Jose       Alex, Joao, Jose,
Sara       Alex, Joao, Jose, Sara,
Thomas     Alex, Joao, Jose, Sara, Thomas,

SQL> 
:-o
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Olá Thomas, muito obrigado pela atenção mais uma vez.

No meu caso específico eu precisava montar uma estrutura das contas contábeis no Oracle Fusion Cloud, então eu tenho as tabelas com as hierarquias das contas e acabei conseguindo montar buscando corretamente usando o LISTAGG para colocá-las em uma única linha.

Creio ser uma coisa bem específica do GL, mas se alguém estiver com uma necessidade próxima a essa, talvez possa ajudar em algo.

Selecionar tudo

SELECT hier_row.pk1_value AS valor_conta
      ,LISTAGG(hier_row.ancestor_pk1_value, '.') WITHIN GROUP (ORDER BY hier_row.distance DESC) AS valor_conta_hierarquia
  FROM fnd_tree_version_vl ftvv
      ,gl_seg_val_hier_rf  hier_row -- Row Flattening
WHERE ftvv.tree_version_id       = hier_row.tree_version_id
   AND ftvv.tree_structure_code   = hier_row.tree_structure_code 
   AND ftvv.tree_code             = hier_row.tree_code
   --
   AND ftvv.tree_code             = 'GL_CONTA_CONTABIL EMPRESA'
   AND ftvv.tree_version_name     = 'GL_CONTA_CONTABIL EMPRESA Current'
   AND ftvv.tree_structure_code   = 'GL_ACCT_FLEX'
   AND NVL(ftvv.status,'ACTIVE')  = 'ACTIVE'
   AND SYSDATE BETWEEN ftvv.effective_start_date AND NVL(ftvv.effective_end_date, SYSDATE)
   AND hier_row.ancestor_pk1_value IS NOT NULL -- Ignora a linha do nó que não tenha um "ancestral"
   --
   -- Conta
   AND hier_row.pk1_value IN ( '1', '11', '111', '11101', '1110101', '1110101000', '1110101001'
                              ,'1110101002', '1110101003' ,'11102', '11103' )    
 GROUP BY hier_row.pk1_value;
Cada conta deve apresentar suas contas "pais" na hierarquia, em sua própria linha (coluna 2):
Resultado:

Selecionar tudo

VALOR_CONTA	VALOR_CONTA_HIERARQUIA
1		1
11		1.11
111		1.11.111
11101		1.11.111.11101
1110101		1.11.111.11101.1110101
1110101000	1.11.111.11101.1110101.1110101000
1110101001	1.11.111.11101.1110101.1110101001
1110101002	1.11.111.11101.1110101.1110101002
1110101003	1.11.111.11101.1110101.1110101003
11102		1.11.111.11102
11103		1.11.111.11103

obrigado.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes