Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
pericles_silva
Contributor III
Contributor III

Solução para uma Tabela Hierárquica

Boa tarde. Estou com uma séria dificuldade em fazer isso.

Só para relembrar que, uma tabela hierarquica, é uma tabela cujo os registros são pais ou filhos de certos registros da mesma tabela.

Vou aplicar um exemplo simples: Uma tabela que armazena dados de computadores.

Id
IdPaiDescricao
1
Desktop
2
Servidores
3
Equipamentos de Rede
183Roteador
193Switch
112Placa-mãe
122Placa de rede
132Processador para servidores
142Memória
1513Processador núcleo simples
1613Processador núcleo duplo
1713Processador de quatro núcleos
41Placa-mãe
51Placa de rede
61Processador para desktops
71Placa de vídeo
81Memória
96Processador de núcleo simples

Até ai tranquilo. O problema é o seguinte: Eu quero criar uma tabela (chamada SERVIDORES:) para pegar apenas os dados A PARTIR do registro "Processadores para servidores" no QlikView.

A tabela resultante seria:

Id
IdPaiDescricao
132Processador para servidores
1513Processador núcleo simples
1613Processador núcleo duplo
1713Processador de quatro núcleos

Segue comando Inline dos dados da tabela origem:

LISTA:

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

];

1 Solution

Accepted Solutions
cesaraccardi
Specialist
Specialist

Olá Péricles, segue sugestão:

TMP_LISTA:

Hierarchy(Id,IdPai,Descricao,Pai,Descricao,'Caminho','\','Nível')

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

]
;



LISTA:

NoConcatenate

LOAD

*

Resident

TMP_LISTA

WHERE Descricao2 = 'Processador para servidores';



DROP TABLE TMP_LISTA;

View solution in original post

6 Replies
aderlanrm
Partner - Specialist
Partner - Specialist

Olá Pericles,

Se você ja sabe quais os código basta fazer:

LOAD Id,

    'Servidor' as IdPai,

    Descricao

Resident LISTA

Where Id = 13 or Id = 15 or Id = 16 or Id = 17;

E colocar isso na tabela dinâmica com os campos na ordem Pai, Descrição.

Mas se você quer que isso fique flexivel para sempre que carregar todos os dados sejam devidamente agrupados

o código fica:

Left Join (LISTA)

LOAD Id as IdPai,

    Descricao as DescricaoPai

Resident LISTA

Where Exists(Id,IdPai) or IsNull(IdPai) or IdPai = '';

Coloquei alguns tratamentos no WHERE que talvez seja desnecessário, avalie.

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
cesaraccardi
Specialist
Specialist

Olá Péricles, segue sugestão:

TMP_LISTA:

Hierarchy(Id,IdPai,Descricao,Pai,Descricao,'Caminho','\','Nível')

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

]
;



LISTA:

NoConcatenate

LOAD

*

Resident

TMP_LISTA

WHERE Descricao2 = 'Processador para servidores';



DROP TABLE TMP_LISTA;

Anonymous
Not applicable

Estou com uma dúvida muito parecida , estou tentando fazer com o Hierarchy , mas não esta dando certo..

tenho

cod1  cod2

1          8

1          7

1          2

2          4

2          9

e quero transformar para

cod1 cod2

1          8

1          7

1          4

1          9

Alguém para dar um help?

aderlanrm
Partner - Specialist
Partner - Specialist

Olá Rodrigo,

Acredito que a melhor opção neste caso é o uso do Mapping, segue:

Grupo:

Mapping

LOAD cod2,

    cod1

From...;

Resultado:

LOAD MapSubString('Grupo',cod1) as cod1,

    cod2,

    Descricao

From...

Where not Exists(cod1,cod2);

O Where é apenas para remover os "gurpos" da tabela cerregada.

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
pericles_silva
Contributor III
Contributor III
Author

Cesar Accardi é isso mesmo. Agora mais uma dúvida:

Gostaria de armazenar em uma variável (valores separados por vírgula) cada ID das peças de computador a partir de "Processador para servidores". Tem como?

$idsCpuServer = 13, 15, 16, 17, (...)

cesaraccardi
Specialist
Specialist

Olá Pericles,

Tem sim.... use a função Concat(Descrição,',')