30 de julio de 2017

Hierarchy para tablas de descendencias

Si se tiene una tabla Padre-Hijo (o From-To, Sender-Receiver, Cuenta-Traspaso, etc.) y se quiere obtener una tabla que identifique todas las descendencias y otra que identifica la descendencia originaria, teniando algo como:

















Esto se puede lograr usando la funcion Hierarchy en el script de Qlikview. Un ejemplo es el siguiente siguiente script:

// --ORIGEN DE DATOS
// -----------------------------------------------------
SourceData:
LOAD * INLINE [
    PADRE, HIJO
    Juan, Jose_JuanHijo
    Jose_JuanHijo, Mario_JuanNieto
    Mario_JuanNieto, Manuel_JuanBisnieto
    Alberto, Maria_AlbertoHija
    Maria_AlbertoHija, Susana_AlbertoNieta
    Susana_AlbertoNieta, Bety_AlbertoBisnieta
    Lucio, Ismael_LucioHijo
    Ismael_LucioHijo, Luis_LucioNieto
    Luis_LucioNieto, Jesus_LucioBisnieto
    Ana, Isabel_AnaHija
    Isabel_AnaHija, Lili_AnaNieta
    Nicolas, Fran_NicolasHijo];

// --Tabla Descendencia
// -----------------------------------------------------
Filogenia:
Hierarchy(NodeID, ParentID, Descendencia, ParentName, NodeName, PathName, '\', Depth)
Load 
 HIJO AS NodeID,
 HIJO AS NodeName,
 HIJO as Descendencia,
 PADRE as ParentID 
resident SourceData;

Left Join(Filogenia) 
LOAD Distinct  
 NodeName as Descendencia1, 
 ParentID as Pariente_Originario 
Resident Filogenia Where Depth=1;

// --Crea tabla con primera descendencia
// ---------------------------------------------------
Descendencia_Origen:
LOAD Distinct
 Pariente_Originario,
 Descendencia as Pariente,
 Depth as Cercania
Resident Filogenia;

// --Filtra tabla Filogenia
// ---------------------------------------------------
Inner Join(Filogenia)
LOAD
 Descendencia1,
 max(Depth) as Depth
Resident Filogenia
Group By Descendencia1;

DROP Fields NodeName, Descendencia, NodeName, PathName, NodeID, ParentID, ParentName, Depth;

EXIT SCRIPT



Referencias
https://community.qlik.com/blogs/qlikviewdesignblog/2013/11/11/unbalanced-n-level-hierarchies
https://community.qlik.com/thread/46580

No hay comentarios: