Jerarquía padre hijo contar hijos

Un usuario Pregunto ✅

hoke

Tengo una tabla con columnas ID de empleado, ID de supervisor. Pude generar la ruta sin ningún problema. Estoy buscando calcular el conteo de niños y el conteo de niños directos con el resultado a continuación.

identificación del empleado ID de supervisor sendero conteo de niños directo conteo de niños
et01 et01 2 8
et02 et01 et01|et02 0 0
et03 et01 et01|et03 2 6
et04 et03 et01|et03|et04 0 0
et05 et03 et01|et03|et05 4 4
et06 et05 et01|et03|et05|et06 0 0
et07 et05 et01|et03|et05|et07 0 0
et08 et05 et01|et03|et05|et08 0 0
et09 et05 et01|et03|et05|et09 0 0

Creé una fórmula. pero es muy lento. Tengo más de 10000 empleados con una jerarquía de 7 niveles.

No. of direct Children = 
var employee_id = ('Table'[HCI_EMPLOYEEID])
var result = CALCULATE (
COUNTrows ( 'Table' ),
IFERROR(SEARCH(employee_id,'Table'[Path]),-1) > 0,
ALL ( 'Table' ) )
Return
 result

Alguien tiene idea de como solucionarlo rapido?

las formulas en excel eran faciles

directo

=COUNTIF([supervisorID];[@employeeID])

todo

=COUNTIF([path];"*"&[@emploeeID]&"*")-1

Owen Auger

Hola @HoKe

Así es como escribiría estas columnas calculadas, usando PATHCONTAINS para el [count of children] columna.

Tenga en cuenta que devolverán un espacio en blanco en lugar de cero en el caso de que no haya niños, pero puede agregar cero al final si lo desea.

¿Estos funcionan mejor para ti?

Saludos,

Owen

count of children direct =
CALCULATE (
    COUNTROWS ( 'Table' ),
    TREATAS ( { 'Table'[employeeID] }, 'Table'[supervisorID] ),
    ALL ( 'Table' )
)

count of children =
VAR CurrentEmployeeID = 'Table'[employeeID]
RETURN
    CALCULATE (
        COUNTROWS ( 'Table' ),
        PATHCONTAINS ( 'Table'[path], CurrentEmployeeID ),
        'Table'[employeeID] <> CurrentEmployeeID,
        ALL ( 'Table' )
    )

amichandak

@HoKe, prueba nuevas columnas como

Direct = var _1 = 'Table'[emploeeID] 
return COUNTX(FILTER('Table', 'Table'[supervisorID] =_1),'Table'[emploeeID])

Total = var _1 = 'Table'[emploeeID] 
return COUNTX(FILTER('Table', PATHCONTAINS('Table'[path],_1)),'Table'[emploeeID])-1

medidas

Direct Count = var _1 = max('Table'[emploeeID] )
return COUNTX(FILTER(ALLSELECTED('Table'), 'Table'[supervisorID] =_1),'Table'[emploeeID])

Total measure = var _1 = max('Table'[emploeeID]) 
return COUNTX(FILTER(ALLSELECTED('Table'), PATHCONTAINS('Table'[path],_1)),'Table'[emploeeID])-1

Buscar archivo después de la firma

CNENFRNL

@HoKe, ¡una pregunta interesante, de hecho!

En cuanto al recuento de hijos directos, las soluciones son sencillas.

Solución de columna calculada,

# Direct = COUNTROWS ( FILTER ( 'Table', 'Table'[supervisorID] = EARLIER ( 'Table'[emploeeID] ) ) )

Solución de medida

Direct = 
COUNTROWS ( FILTER ( ALL ( 'Table' ), 'Table'[supervisorID] = MAX ( 'Table'[emploeeID] ) ) )

Columna calculadaColumna calculadaMedir en la tabla a saberMedir en la tabla a saber

En cuanto a número de niños, la dificultad sube exponencialmente!! Porque DAX carece de funciones prêt-à-manger o metodologías para crear algunas funciones recursivas sencillas. Afortunadamente, con la columna de ayuda sendero, la solución es así,

# All Children = 
COUNTROWS (
    FILTER (
        'Table',
        NOT ( ISERROR ( SEARCH ( EARLIER ( 'Table'[emploeeID] ), 'Table'[path] ) ) )
    )
) - 1

Captura de pantalla 2020-11-09 033135.png

por cierto, mi solución PQ para enumerar la jerarquía es

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSi0xMFTSUVKK1QGzjYBssBCUb4zGN4HwjWF8UzS+GYRvCuObo/Et0PiWcH4sAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [empID = _t, supID = _t]),
    emp = List.Buffer(Source[empID]),
    sup = List.Buffer(Source[supID]),
    Custom1 = Table.AddColumn(Source, "Hierarchy",
        each
            let
                fx = (empid as text, hierarchy as list) as list => 
                let
                    supervisor = sup{List.PositionOf(emp, empid)},
                    result = if supervisor="" then hierarchy else @fx(supervisor, hierarchy & {supervisor})
                in
                    result                
            in {[empID]} & fx([empID], {})
    ),
    #"Extracted Values" = Table.TransformColumns(Custom1, {"Hierarchy", each Text.Combine(List.Transform(_, Text.From), " | "), type text})
in
    #"Extracted Values"

hoke

En respuesta a CNENFRNL

Muchísimas gracias. la columna #all childer funciona pero es muy lenta.

amichandak

@HoKe, prueba nuevas columnas como

Direct = var _1 = 'Table'[emploeeID] 
return COUNTX(FILTER('Table', 'Table'[supervisorID] =_1),'Table'[emploeeID])

Total = var _1 = 'Table'[emploeeID] 
return COUNTX(FILTER('Table', PATHCONTAINS('Table'[path],_1)),'Table'[emploeeID])-1

medidas

Direct Count = var _1 = max('Table'[emploeeID] )
return COUNTX(FILTER(ALLSELECTED('Table'), 'Table'[supervisorID] =_1),'Table'[emploeeID])

Total measure = var _1 = max('Table'[emploeeID]) 
return COUNTX(FILTER(ALLSELECTED('Table'), PATHCONTAINS('Table'[path],_1)),'Table'[emploeeID])-1

Buscar archivo después de la firma

Owen Auger

Hola @HoKe

Así es como escribiría estas columnas calculadas, usando PATHCONTAINS para el [count of children] columna.

Tenga en cuenta que devolverán un espacio en blanco en lugar de cero en el caso de que no haya niños, pero puede agregar cero al final si lo desea.

¿Estos funcionan mejor para ti?

Saludos,

Owen

count of children direct =
CALCULATE (
    COUNTROWS ( 'Table' ),
    TREATAS ( { 'Table'[employeeID] }, 'Table'[supervisorID] ),
    ALL ( 'Table' )
)

count of children =
VAR CurrentEmployeeID = 'Table'[employeeID]
RETURN
    CALCULATE (
        COUNTROWS ( 'Table' ),
        PATHCONTAINS ( 'Table'[path], CurrentEmployeeID ),
        'Table'[employeeID] <> CurrentEmployeeID,
        ALL ( 'Table' )
    )

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *