¿Es posible filtrar por subtotales?

Un usuario Pregunto ✅

andressalomon

Hola comunidad, mi primera publicación aquí. Llevo unos meses trabajando con DAX pero ahora me enfrento a una situación que no puedo resolver. Mi situación es un poco complicada de escribir, pero haré todo lo posible para resumirla, para que puedas entenderla fácilmente.

Tengo un informe que tiene una tabla como esta de donde obtengo los datos:

Nombre________País____________WBS_________Mes________Asignación

Nombre1_______EE.UU.________________WBS1________Ene___________1

Nombre1_______EE.UU.________________WBS2________Ene___________1

Nombre2_______China______________WBS3________Ene___________1

Nombre2_______China______________WBS4________Feb___________1

Nombre2_______China______________WBS5________Feb___________1

El objetivo aquí es identificar a las personas que están «Sobreasignadas» a una EDT (considerando 1 como la asignación máxima)

Entonces, creé una medida simple: Medida de asignación = SUMA ([Allocation]). Luego creé una tabla dinámica como la siguiente (no escribo todos los meses por razones prácticas, pero imagina la imagen completa de todo el año). La medida va en el campo «Valores».

Nombre________WBS________Ene_______Feb_____Mar……………
Nombre1______WBS1________1_________0________
______________WBS2_________1_________0________
Nombre1 Total_______________2_________0________ (Esta es la función «Subtotal» de las tablas dinámicas)
Nombre2______WBS3________1_________0_________

______________WBS4_________0_________1_________
______________WBS5_________0_________1_________
Nombre2 Total_______________1_________2_________

Entonces, la gente de EE. UU. se sobreasigna en enero y la otra de China se sobreasigna en febrero (la cosa aquí es imaginar que hay miles de filas y todos los meses)

Lo que estoy tratando de hacer es filtrar las filas (si es posible, dinámicamente, como una segmentación) por la función Subtotal en la tabla dinámica porque, como puede imaginar, no todas las personas están sobreasignadas, y quiero deje solo aquellos Subtotales que sean mayores que un valor elegido por el usuario (por ejemplo, mayor o igual a 2, o mayor a 1.5).

Estaba tratando, primero, de identificar la fila del Subtotal, según la publicación de Rob Collie aquí (CRÉDITOS PARA ÉL):
https://powerpivotpro.com/2012/03/subtotales-y-grandes-totales-que-se-suman-correctamente/

Y combinando eso con el Patrón de Tabla de Parámetros del sitio de Marco Russo y Alberto Ferrari (CRÉDITOS PARA ELLOS):
http://www.daxpatterns.com/parameter-table/

Entonces, la idea fue identificar la fila actual como una fila Subtotal y luego usar una tabla de parámetros (llamémosla ‘Filtros’, con la columna [Filters] para darle al usuario opciones para filtrar por diferentes valores, pero claramente mi conocimiento no llega tan lejos…

Intenté algo como esto con algunas variantes, pero no funciona. Simplemente me mantiene filtrando por los valores en las filas comunes, y no en función de la fila Subtotal.

Prueba de medida de asignación:=IF(COUNTROWS(VALUES([Name]))=1,
[Allocation Measure],
IF(HASONEVALUE(‘Filtros'[Filters]),
SUMX(FILTRO(Datos, [Allocation]>=VALORES(‘Filtros'[Filters]))),
[Allocation Measure])
)
)

Creo que estoy mezclando todo, tan frustrante… Cualquier consejo o solución (o solución, DIOS TE BENDIGA) aquí sería apreciado. Por favor, avíseme si necesita más detalles o si no me expliqué bien o si ve algún error.

De verdad gracias de antemano.

Saludos,

Andy.-

tommartens

Oye,

Crearía una columna calculada así

OverAllocation = 
IF(
  CALCULATE(
    SUM('table'[Allocation])
    ,ALLEXCEPT('table','table'[Name],'table'[Month])
  ) > 1
,"True"
,"False"
)

Es necesario usar CALCULATE() para crear una columna calculada, porque SUM() eventualmente tiene que agregar más de una fila, pero no todas las filas.

ALLEXCEPT() permite expandir el contexto de filtro agregado a la fila actual usando CALCULATE(), precisamente: el contexto de fila implícito se transforma en un contexto de filtro.

ALLEXCEPT() elimina el filtro de todas las columnas, excepto de la columna Nombre y Mes.

Tenga en cuenta que es posible que también deba considerar el año, si hay una columna de fecha en algún lugar de su tabla.

Ahora puede usar esta columna para dividir sus datos usando todas las posibilidades de Power BI

Espero que esto ayude

Saludos

Tomás

tommartens

Oye,

Crearía una columna calculada así

OverAllocation = 
IF(
  CALCULATE(
    SUM('table'[Allocation])
    ,ALLEXCEPT('table','table'[Name],'table'[Month])
  ) > 1
,"True"
,"False"
)

Es necesario usar CALCULATE() para crear una columna calculada, porque SUM() eventualmente tiene que agregar más de una fila, pero no todas las filas.

ALLEXCEPT() permite expandir el contexto de filtro agregado a la fila actual usando CALCULATE(), precisamente: el contexto de fila implícito se transforma en un contexto de filtro.

ALLEXCEPT() elimina el filtro de todas las columnas, excepto de la columna Nombre y Mes.

Tenga en cuenta que es posible que también deba considerar el año, si hay una columna de fecha en algún lugar de su tabla.

Ahora puede usar esta columna para dividir sus datos usando todas las posibilidades de Power BI

Espero que esto ayude

Saludos

Tomás

andressalomon

En respuesta a tommartens

¡Hola Tom, gracias por responder! Muy apreciado.

Intenté esto y funciona de una manera extraña … No filtra los sobreasignados, solo deja en blanco aquellos que tienen un valor igual a cero, pero mantiene todas las filas. Me gusta:

Antes de filtrar por «Verdadero»:

Nombre________WBS_________Ene_______Feb_______Mar
Nombre1______WBS1_________0__________0________1

Después de filtrar por «Verdadero»:

Nombre________WBS_________Ene_______Feb_______Mar
Nombre1______WBS1_________ __________ ________1

Y si filtro por «Falso» deja una tabla vacía.

¿Entiendes lo que quiero decir?

Además, por ejemplo, ¿dónde le digo que quiero mantener a aquellas personas que tienen (en su fila Subtotal) más de un valor específico?

Tal vez no entiendo completamente la columna calculada que proporcionó. Lo siento, sigo aprendiendo DAX.

¡Gracias de nuevo!

Saludos,

Andy.-

tommartens

En respuesta a andressalomon

Oye,

tienes toda la razón, si dices que no puedes entender el funcionamiento de la fórmula, esto se debe a lo siguiente: la fórmula es incorrecta, me perdí una parte esencial «SI (… > 1 ,

Acabo de corregir esto en mi primera publicación, lo siento por eso.

Saludos

Tomás

andressalomon

En respuesta a tommartens

Bueno, Tom, esto está funcionando, al menos como primera vista/comprobación. Lo marqué como un solución, y por supuesto no tengo palabras para agradeceros!!!

Ahora, no quiero sonar codicioso, pero ¿crees que existe la posibilidad de hacer que «>1» sea una variable que el usuario pueda ingresar? Porque puede existir la posibilidad de que se permita que una persona tenga una asignación 1.1 o 1.2, depende del usuario.

Es solo curiosidad, pero si crees que esto merece otra publicación, no te preocupes, ya me alegraste el día, quizás demasiados días. carita muy feliz

Realmente gracias de nuevo!

Saludos,

Andy.-

Deja un comentario

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