Ir ao conteúdo
  • Cadastre-se

Trazer descrição em uma consulta em tabela com vários níveis


Ir à solução Resolvido por Poliano Martini,

Posts recomendados

Olá pessoal!

 

Tenho uma tabela de centro de custo onde ela possui ligação com ela mesma, ocorrendo o caso de vários níveis...

 

Ex:

 

ccu_codigo - ccu_descricao - ccu_codigo_grupo
1 - Administração - null
2 - Comercial - null
3 - Financeiro - 1
4 - Recursos Humanos - 1
5 - Marketing - 2
6 - Vendas - 2
7 - Interno - 6
8 - Externo - 7

 

Uma consulta simples pra trazer os registros:

Select
  fin_centro_custo.ccu_codigo,
  fin_centro_custo.ccu_descricao
From
  fin_centro_custo
Order By
  fin_centro_custo.ccu_descricao;

 

O retorno é:

 

1 - Administração
2 - Comercial
8 - Externo
3 - Financeiro
7 - Interno
5 - Marketing
4 - Recursos Humanos
6 - Vendas

 

Como eu faria pra retornar assim:

 

1 - Administração
3 - Administração | Financeiro
4 - Administração | Recursos Humanos
2 - Comercial
5 - Comercial | Marketing
6 - Comercial | Vendas
8 - Comercial | Vendas | Externo
7 - Comercial | Vendas | Interno

 

O máximo que consegui foi trazer somente um nível acima com "Join".

Link para o comentário
Compartilhar em outros sites

Acho que pro seu caso um subselect já resolve, tente algo desse tipo

 

Select
ccu_codigo,
ccu_descricao, if ccu_codigo_grupo is not null then (select ' | ' + ccu_descricao from fin_centro_custo where  fin_centro_custo.ccu_codigo =  ccu_codigo_grupo) else null end
From
  fin_centro_custo
Order By
  fin_centro_custo.ccu_descricao;

 

Link para o comentário
Compartilhar em outros sites

6 horas atrás, Frango Light disse:

Acho que pro seu caso um subselect...

 

Nesse exemplo só retorna o subgrupo em 1 nível. Por exemplo, o item "Externo" mostra apenas o grupo que ele pertence que no caso é "Vendas", mas "Vendas" está dentro de "Comercial", então gostaria que retorna-se um dentro do outro "Comercial | Vendas | Externo".

Link para o comentário
Compartilhar em outros sites

Não querendo me intrometer, mas acho que seria algo como

 

Select
ccu_codigo,
ccu_descricao, if ccu_codigo_grupo is not null then (select ' | ' + string_agg( ccu_descricao, ' | ') from fin_centro_custo where  fin_centro_custo.ccu_codigo =  ccu_codigo_grupo) else null end
From
  fin_centro_custo
Order By
  fin_centro_custo.ccu_descricao;

 

Link para o comentário
Compartilhar em outros sites

  • Solução

Devido ao registro poder ter vários níveis, não consegui utilizando a função "string_agg", pois sempre retornava somente o grupo do item... mas consegui através de uma consulta recursiva:

 

http://debugandoduvida.blogspot.com.br/2016/04/query-recursiva-no-postgresql-estrutura.html

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!