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 calculada
Medir 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
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' )
)