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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

ayuda con medidas complejas

Hola, realmente aprecio si alguien puede ayudarme con este problema

Los datos se parecen a esta tabla

Escuela de IDENTIFICACIÓNNivelServicioQty
101escuela primariaAlmuerzo20
101escuela primariaDesayuno18
101escuela primariaAperitivos7
101escuela secundariaAlmuerzo30
101escuela secundariaDesayuno40

Se requiere una medida que sumar la cantidad máxima por nivel

Escuela primaria Max Qty20
Escuela secundaria Max Qty40
Medir el resultado esperado60

1 ACCEPTED SOLUTION

Hola @KurtVogel ,

aquí hay una medida que considera más que una agrupación de columnas:

SUMX across MAX using SUMMARIZE = 
SUMX(
    ADDCOLUMNS(
        SUMMARIZE(
            'Table'
            , 'Table'[ID School]
            , 'Table'[Level]
        )
        , "MaxQty" , CALCULATE( MAX( 'Table'[Qty] ) )
    )
    , [MaxQty]
)

Si necesito más de una columna dentro de mi tabla iteradora utilizo SUMMARIZE(...) o funciones de tabla que me permiten componer tablas que son más complejas. Si solo hay una columna que determina la tabla, uso VALORES.

El resultado:

image.png

Con suerte, esto proporciona lo que necesita para enfrentar su desafío.

Entonces, volviendo a usar SUMMARIZECOLUMNS vs SUMMARIZE, dependiendo de sus requisitos, recomendaría usar SUMMARIZECOLUMNS ya que está optimizado y por esta razón, funcionará mejor, a veces podrá notar esta ventaja, a veces no, ya que esto dependerá del tamaño de sus datos.

Pero, por supuesto, las cosas pueden volverse más complejas, como muestra la siguiente captura de pantalla:

image.png

En la 2ª línea de visuales utilizo la medida "SUMX across MAX using SUMMARIZECOLUMNS":

SUMX across MAX using SUMMARIZECOLUMNS = 
SUMX(
    SUMMARIZECOLUMNS(
        'Table'[ID School]
        , 'Table'[Level]
        , "MAXQty" , MAX( 'Table'[Qty] )
    )
    , [MAXQty]
)

La medida funciona dentro de la tarjeta visual pero se rompe dentro de la tabla visual.

Explicar por qué se rompe requiere más espacio del que está disponible aquí y ya está hecho al menos en cierta medida por el artículo que mencioné en mi respuesta anterior a @KNP. Aprender también significa desarrollar hábitos mediante el uso de patrones, los hábitos luego nos ayudarán a aplicar las cosas aprendidas más rápido. Por esta razón, desarrollé el hábito de usar RESUMIR sobre RESUMIRCOLUMNAS. Saber que RESUMIR no es tan rápido como RESUMIRCOLUMNS.

Cuando trabajo con grandes conjuntos de datos y cada milisegundo cuenta, a veces escribo medidas solo para un solo visual, estos momentos son raros y surgen otros problemas como la complejidad del modelo.

Saludos

Gato

View solution in original post

13 REPLIES 13
Syndicate_Admin
Administrator
Administrator

SumOfMax =
SUMX (
RESUMIRCOLUMNAS (
Tabla[Nivel],
"MaxOfLevel", MAX ( Tabla[Cantidad] )
),
[MaxOfLevel]
)

Eh

no es posible usar SUMMARIZECOLUMNS dentro de un iterador de tabla.

Saludos

Gato

@TomMartens - Puede que te esté malinterpretando, pero mis pruebas tenderían a estar en desacuerdo. Sin embargo, definitivamente no soy un experto en DAX.

KNP_1-1633492672745.png

gracias, la solución funciona pero si aplico un filtro de contexto el visual mostrar error

Gracias por el ejemplo adicional.

No estoy seguro de cuál es el problema con el filtro. Necesitaría más detalles.

La forma en que lo resolvería sería...

SumOfMax =
SUMX (
    SUMMARIZECOLUMNS (
        'Table'[ID School],
        'Table'[Level],
        "GroupedMax", MAX ( 'Table'[Qty] )
    ),
    [GroupedMax]
)

Puede pagar para ponerse al día con la conversación que tuve con Tom anteriormente, ya que esto puede no considerarse una buena práctica.

De lo contrario, tal vez espere a que @TomMartens responda, ya que no estoy seguro de cómo reescribir la versión "VALUES()" de la medida para incluir los dos niveles de agrupación que necesita.

Hola @KNP ,

por favor, disculpe, he sido un poco estricto diciendo

"no es posible usar SUMMARIZECOLUMNS dentro de un iterador de tabla",

Debería haber dicho

"no se debe usar SUMMARIZECOLUMNS dentro de una medida".
Esto se debe a que la función no es totalmente soportada, por esta razón, no la uso para evitar hábitos de construcción, que luego se convierten en un obstáculo si tengo que reescribir una medida o patrón que estoy tratando de adaptar a un determinado caso de uso donde SUMMARIZECOLUMNS no se puede usar. Aquí encontrará un artículo que explica esto con mucho más detalle: Presentación de SUMMARIZECOLUMNS - SQLBI

Una vez más, discúlpenme por ser tan estricto y, por supuesto, la medida funciona perfectamente para este requisito.

Saludos

Gato

Hola Tom,

Gracias por la aclaración.

Entiendo lo que estás diciendo. Funciona en este caso, pero no es una buena práctica.

DAX es definitivamente la parte más débil de mi conjunto de habilidades, así que siempre estoy feliz de aprender de los demás.

Siento que debería advertir mis respuestas relacionadas con DAX aquí con "No soy un experto en DAX", pero de nuevo, siento que todas las respuestas en la comunidad vienen con una advertencia implícita.

Saludos

Kim

Syndicate_Admin
Administrator
Administrator

Hola @KurtVogel

esta medida:

sum over max = 
SUMX(
    VALUES( 'Table'[Level] )
    , CALCULATE( MAX( 'Table'[Qty] ) )
)

devuelve lo que buscas:

image.png

El uso de una función de iterador de tabla, aquí SUMX, es necesario porque no hay un encabezado de fila que se convierta en parte del contexto del filtro. Como el valor MAX debe calcularse para cada nivel escolar, VALUES( level ) se utiliza para determinar la tabla utilizada para la iteración. En la línea total, hay una iteración en dos filas (escuela secundaria, escuela primaria), dentro del cuerpo de la tabla visual solo hay una fila, ya que el "encabezado de fila" implícitamente "filtra" la tabla.

Con suerte, esto proporciona lo que está buscando.

Saludos

Gato

Hola, gracias! funciona para el ejemplo pero todavía tiene un pequeño problema, cuando se aplica esta medida a la tabla completa con varios ID School no muestra el valor correcto,

Escuela de IDENTIFICACIÓNNivelServicioQty
101escuela primariaAlmuerzo20
101escuela primariaDesayuno18
101escuela primariaAperitivos7
101escuela secundariaAlmuerzo30
101escuela secundariaDesayuno40
602escuela primariaAlmuerzo10
602escuela primariaDesayuno21
602escuela secundariaAlmuerzo25
602escuela secundariaDesayuno15


Cantidad máxima por servicio en
ID 101
para la escuela primaria es 20,
Para la escuela secundaria es 40
en ID 602
para la escuela primaria es 21,
Para la escuela secundaria es 25

El resultado esperado de la medida es 20+40+21+25 = 106

pero la medida muestra 61

Muchas gracias por su tiempo

Hola @KurtVogel ,

aquí hay una medida que considera más que una agrupación de columnas:

SUMX across MAX using SUMMARIZE = 
SUMX(
    ADDCOLUMNS(
        SUMMARIZE(
            'Table'
            , 'Table'[ID School]
            , 'Table'[Level]
        )
        , "MaxQty" , CALCULATE( MAX( 'Table'[Qty] ) )
    )
    , [MaxQty]
)

Si necesito más de una columna dentro de mi tabla iteradora utilizo SUMMARIZE(...) o funciones de tabla que me permiten componer tablas que son más complejas. Si solo hay una columna que determina la tabla, uso VALORES.

El resultado:

image.png

Con suerte, esto proporciona lo que necesita para enfrentar su desafío.

Entonces, volviendo a usar SUMMARIZECOLUMNS vs SUMMARIZE, dependiendo de sus requisitos, recomendaría usar SUMMARIZECOLUMNS ya que está optimizado y por esta razón, funcionará mejor, a veces podrá notar esta ventaja, a veces no, ya que esto dependerá del tamaño de sus datos.

Pero, por supuesto, las cosas pueden volverse más complejas, como muestra la siguiente captura de pantalla:

image.png

En la 2ª línea de visuales utilizo la medida "SUMX across MAX using SUMMARIZECOLUMNS":

SUMX across MAX using SUMMARIZECOLUMNS = 
SUMX(
    SUMMARIZECOLUMNS(
        'Table'[ID School]
        , 'Table'[Level]
        , "MAXQty" , MAX( 'Table'[Qty] )
    )
    , [MAXQty]
)

La medida funciona dentro de la tarjeta visual pero se rompe dentro de la tabla visual.

Explicar por qué se rompe requiere más espacio del que está disponible aquí y ya está hecho al menos en cierta medida por el artículo que mencioné en mi respuesta anterior a @KNP. Aprender también significa desarrollar hábitos mediante el uso de patrones, los hábitos luego nos ayudarán a aplicar las cosas aprendidas más rápido. Por esta razón, desarrollé el hábito de usar RESUMIR sobre RESUMIRCOLUMNAS. Saber que RESUMIR no es tan rápido como RESUMIRCOLUMNS.

Cuando trabajo con grandes conjuntos de datos y cada milisegundo cuenta, a veces escribo medidas solo para un solo visual, estos momentos son raros y surgen otros problemas como la complejidad del modelo.

Saludos

Gato

@TomMartens - Gracias por tomarse el tiempo para explicar. Las reglas sobre cuándo usar cuál en DAX sigue siendo un misterio para mí. Necesito ir a pasar mucho más tiempo con Alberto y Marco. 😁

¡Juntos aprendemos, juntos crecemos!

Syndicate_Admin
Administrator
Administrator

Picture2.png

Medida esperada del resultado : =
SUMX ( VALORES ( 'Tabla'[Nivel] ), CALCULAR ( MAX ( 'Tabla'[Cantidad] ) )

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.