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

DAX: devuelve un resultado basado en el resultado de un MINX en la misma medida

Hola comunidad,

Perdón por el terrible "tema", pero no se me ocurrió un título mejor.

Antecedentes: Quiero generar una simulación de benchmark. En este escenario produzco un producto, que consiste en muchos materiales diferentes. El mismo producto se produce en diferentes talleres. Cada taller utiliza una división de %ligeramente diferente para definir la cantidad concreta de uso de material. Además, cada taller compra esos materiales con diferentes precios a proveedores locales.

Ahora, en mi punto de referencia, quiero averiguar qué taller produce el producto más barato, basado en los precios locales para cada material multiplicados con el % de material dividido en el producto. El taller que produce el producto más barato se convierte en el punto de referencia para los otros talleres en función del material %-split utilizado.

.... espero que todavía estés conmigo. 😀

Ahora lo que hago para llegar allí:

  1. Primero necesito averiguar qué taller produce el producto más barato
  2. Para luego utilizar ese mismo material dividido utilizado en el producto más barato para simularlo con los precios de cada material en otros talleres utilizando el material-Split-en-% más barato

I_LOVE_POWER_BI_0-1638953907507.png

El producto en "Workship B" se está produciendo el más barato. Luego quiero usar esa división para simular el efecto en los otros talleres.

Primer paso que puedo gestionar: defino el punto 1 usando CALCULATE y MINX para calcular el precio del producto más barato en el contexto de filtro dado:

Precio del producto más barato =
CALCULAR (
BRIBONA (
RESUMIR (
'Recetas',
'Recetas'[Taller-Producto-Clave],
'Recetas'[Material],
"Compuesto-Material-Precio",
SUMA ( 'Recetas'[%-Split] ) * [Precio]
),
[Compuesto-Material-Precio]
),
ELIMINARFILTROS ( 'Taller' )
)
Entonces, supongo que tengo el 80% del trabajo hecho. Pero mi lucha ahora es que el resultado de la medida anterior me da el precio, no la división porcentual. Eso está bien a primera vista, porque primero tengo que definir el mínimo para definir qué división usar. Ahora viene:
¿Cómo puedo obtener el %-Split como salida, basado en el precio más barato de la primera medida?
No se me ocurre un booleano o una condición para decirle "eso" que use la división basada en el precio más barato ...
Espero que hayas entendido mi problema.
Gracias por tomarse el tiempo!!!
1 ACCEPTED SOLUTION

Utilicé los mismos datos de muestra, nombres de tabla y nombres de campo que se muestran en su imagen, y creé relaciones entre ellos.

sreenathv_0-1638975185887.png

sreenathv_1-1638975489564.png

He utilizado Materiales [Material] y Talleres [Taller] en todas las imágenes de Matrix.

Todos los valores son medidas.

Los siguientes son el DAX utilizado para las medidas.

Split% = SUMX(Products,Products[Split])
Prices = SUMX(Prices,Prices[Price])
Product Cost =
VAR MaterialsInCurrentRowContext =
    VALUES ( Materials[Material] )
VAR AddCost =
    ADDCOLUMNS ( MaterialsInCurrentRowContext, "Cost", [Prices] * [Split%] )
VAR Result =
    SUMX ( AddCost, [Cost] )
RETURN
    Result
Minimum Product Cost =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS ( CJ, "Product Cost", [Product Cost] )
VAR Result =
    MINX ( AddCostColumn, [Product Cost] )
RETURN
    Result
Minimum Cost Workshop =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS ( CJ, "Product Cost", [Product Cost] )
VAR MinCost =
    MINX ( AddCostColumn, [Product Cost] )
VAR MinCostRecord =
    FILTER ( AddCostColumn, [Product Cost] = MinCost )
VAR Result =
    CONCATENATEX ( MinCostRecord, Workshops[Workshop] )
RETURN
    Result
Simulated Product Cost =
VAR MaterialsInCurrentRowContext =
    VALUES ( Materials[Material] )
VAR MinCostWorkshop = [Minimum Cost Workshop]
VAR AddCost =
    ADDCOLUMNS (
        MaterialsInCurrentRowContext,
        "Cost",
            [Prices]
                * CALCULATE ( [Split%], Workshops[Workshop] = MinCostWorkshop )
    )
VAR Result =
    SUMX ( AddCost, [Cost] )
RETURN
    Result

Hay una advertencia en esta solución. He asumido que siempre habrá "un solo taller" con un costo mínimo. Si hay dos talleres con el mismo costo, pero usan diferentes divisiones de materiales, ???????

¿Cuál es la probabilidad?

View solution in original post

15 REPLIES 15
Syndicate_Admin
Administrator
Administrator

Por curiosidad, lo intenté. El siguiente es el resultado.

sreenathv_0-1638959524259.png

Utilicé el siguiente modelo de datos de ejemplo.

sreenathv_1-1638959585919.png

No estoy publicando el código DAX deliberadamente porque mi código DAX funciona en parte debido a estas estructuras de tabla y la relación entre ellas. Además, he utilizado múltiples funciones CALCULATE() para hacer transiciones entre contextos de fila a contextos de filtro dentro de Medidas.

Consulte las capturas de pantalla y, si está tratando de hacer algo similar, publique las estructuras de la tabla y las relaciones entre ellas. Si es posible, envíe su pbix con algunos datos de muestra en él. Completaré el DAX y los publicaré de nuevo.

Muchas gracias por tomarse el tiempo, eso es muy apreciado, ¡increíble!

Mis mesas se ven ligeramente diferentes. Lamentablemente, aún no encontré una manera de compartir mis datos, ya que nuestra organización deshabilitó el uso compartido de OneDrive con personas fuera de la organización. :-(((

Mis tablas se ven así y conectadas de la siguiente manera (se siente como una gran pérdida en la vida para reproducir esto en excel, jajaja):

I_LOVE_POWER_BI_0-1638971131789.png

Entonces, la única diferencia con su modelo es que "Material-Split" y "Product" son lo mismo en mi modelo de datos.

Por cierto. Estoy realmente sorprendido de lo bien que obtuviste el punto de mi historia, ¡realmente increíble y estoy realmente agradecido por lo que hiciste!

Espero con ansias su código y respuesta basados en mi adaptación del modelo de datos, gracias de nuevo!!!

¡Bien!

Utilicé los mismos datos de muestra, nombres de tabla y nombres de campo que se muestran en su imagen, y creé relaciones entre ellos.

sreenathv_0-1638975185887.png

sreenathv_1-1638975489564.png

He utilizado Materiales [Material] y Talleres [Taller] en todas las imágenes de Matrix.

Todos los valores son medidas.

Los siguientes son el DAX utilizado para las medidas.

Split% = SUMX(Products,Products[Split])
Prices = SUMX(Prices,Prices[Price])
Product Cost =
VAR MaterialsInCurrentRowContext =
    VALUES ( Materials[Material] )
VAR AddCost =
    ADDCOLUMNS ( MaterialsInCurrentRowContext, "Cost", [Prices] * [Split%] )
VAR Result =
    SUMX ( AddCost, [Cost] )
RETURN
    Result
Minimum Product Cost =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS ( CJ, "Product Cost", [Product Cost] )
VAR Result =
    MINX ( AddCostColumn, [Product Cost] )
RETURN
    Result
Minimum Cost Workshop =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS ( CJ, "Product Cost", [Product Cost] )
VAR MinCost =
    MINX ( AddCostColumn, [Product Cost] )
VAR MinCostRecord =
    FILTER ( AddCostColumn, [Product Cost] = MinCost )
VAR Result =
    CONCATENATEX ( MinCostRecord, Workshops[Workshop] )
RETURN
    Result
Simulated Product Cost =
VAR MaterialsInCurrentRowContext =
    VALUES ( Materials[Material] )
VAR MinCostWorkshop = [Minimum Cost Workshop]
VAR AddCost =
    ADDCOLUMNS (
        MaterialsInCurrentRowContext,
        "Cost",
            [Prices]
                * CALCULATE ( [Split%], Workshops[Workshop] = MinCostWorkshop )
    )
VAR Result =
    SUMX ( AddCost, [Cost] )
RETURN
    Result

Hay una advertencia en esta solución. He asumido que siempre habrá "un solo taller" con un costo mínimo. Si hay dos talleres con el mismo costo, pero usan diferentes divisiones de materiales, ???????

¿Cuál es la probabilidad?

Estimado screenathv,

¡No puedo decirte lo agradecido que estoy! ¡Muchas gracias por el apoyo! Las medidas funcionan muy bien. Copié todo en mi archivo pbix y funciona.

Sin embargo, ¿puedo molestarte con una "especialidad" más?

El comportamiento actual es el siguiente:

I_LOVE_POWER_BI_1-1639019228596.png

Desde este punto de vista, combiné todas las medidas y comparé los talleres B y C.

Mi objetivo es que, sobre la base de los costos generales más baratos del taller, la división porcentual para cada material de ese taller se aplique en los otros talleres. Sin embargo, actualmente se elige el material más barato.

Así que para ser más concretos, para la simulación del Taller C, quiero que cada material del Taller B se utilice como mínimo. En otras palabras, el mínimo de cada material estará determinado por el costo mínimo total.

También agregué un material 6 para pruebas, que tiene un precio para cada Taller, sin embargo, solo se usa en la división de productos del Taller C; también en tal caso, la simulación debe basarse en la división (más barata) del Taller B, así que muestre un espacio en blanco en la columna "Costo del producto simulado".

¿Qué hay que ajustar para que eso sea posible?

Gracias de nuevo mil veces!!!

Esa es la razón por la que pedí el pbix. Quería entender bajo qué contexto de evaluación se ejecutan las medidas. En la captura de pantalla de la matriz que ha publicado, ha introducido "material" en el contexto de evaluación de "Costo mínimo". Así que se evaluó a nivel material. Si no desea eso, retire los filtros en Materiales[Material] usando la función REMOVEFILTERS.

A continuación se indican las dos medidas modificadas.

Minimum Cost Workshop =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS (
        CJ,
        "Product Cost", CALCULATE ( [Product Cost], REMOVEFILTERS ( Materials[Material] ) )
    )
VAR MinCost =
    MINX ( AddCostColumn, [Product Cost] )
VAR MinCostRecord =
    FILTER ( AddCostColumn, [Product Cost] = MinCost )
VAR Result =
    CONCATENATEX ( MinCostRecord, Workshops[Workshop] )
RETURN
    Result
Minimum Product Cost =
VAR AllWorkshops =
    ALLSELECTED ( Workshops[Workshop] )
VAR AllProducts =
    ALLSELECTED ( Products[Product] )
VAR CJ =
    CROSSJOIN ( AllWorkshops, AllProducts )
VAR AddCostColumn =
    ADDCOLUMNS (
        CJ,
        "Product Cost", CALCULATE ( [Product Cost], REMOVEFILTERS ( Materials[Material] ) )
    )
VAR Result =
    MINX ( AddCostColumn, [Product Cost] )
RETURN
    Result

Esto le dará el siguiente resultado.

sreenathv_0-1639026368034.png

A veces, incluso si las medidas que escribimos dan el resultado correcto en un visual, podría ser debido al contexto de la evaluación. Si uno de sus usuarios prueba la opción "Analizar en Excel" de su informe publicado y arrastra la medida a un Power Pivot y la evalúa en un contexto diferente, no podemos estar realmente seguros de que dará el resultado correcto. Para eso, como diseñador de informes, tienes que pensarlo desde todos los ángulos.

Por ejemplo, a continuación se muestra la captura de pantalla de dos elementos visuales de matriz, el primero usa el campo "Material[Material]" en las filas, el segundo visual usa Productos[Material] en las filas. Vea cómo la medida "Precios" está dando resultados correctos en el primer caso y precios incorrectos en el segundo visual.

sreenathv_0-1639027269499.png

Al mismo tiempo, la medida "Costo mínimo del producto" muestra el costo a nivel de material en un visual y a nivel de producto en otro. Ahora tienes todas las medidas que necesitas. Si es necesario, cree varias variantes de la misma medida, una con "REMOVEFILTERS" y otra sin ella. Y úselos en diferentes contextos / imágenes en consecuencia según cómo desee que los usuarios vean las figuras.

¡Tienes razón! ¡Funciona! Y sí, también tienes razón, que la respuesta REALMENTE depende del contexto del filtro.

Por favor, no se enoje, pero tengo otra pregunta:

Si tengo más de un solo producto en la misma visualización matricial, la evaluación se llevará a cabo para cada producto, no para todos los productos:

I_LOVE_POWER_BI_0-1639028958100.png

¿Está bien si cambio la variable "AllProducts" de ALLSELECTED a VALUES, de modo que el contexto de filtro a nivel de producto se use en función del contexto del filtro de matriz? ¿O esto dañará algo más?

Arrepentido.... me siento súper nooby aquí. Gracias de nuevo!!!

Sí. Puede cambiar ALLSELECTED() a VALUES(). Pero recuerda cambiarlo tanto las medidas - Taller de Costo Mínimo y Costo Mínimo del Producto

¡Bien! ¡Lo hice y funciona! ¡Gracias sreenathv!

Ahora probándolo, y también probando diferentes escenarios nuevamente, me di cuenta de un problema (supongo que el 😄 pasado). En caso de que un taller de referencia (=Mínimo) esté utilizando un material que no se utilice en los otros talleres, la división total del 100% de suma se utilizará para simular el potencial general:

I_LOVE_POWER_BI_0-1639030790494.png

Entonces, en este ejemplo, para el Material 2 y 6, que se utilizan en el taller 2 más barato, la simulación no funciona, ya que ese material no se usa en el taller C aquí, significa que solo está calculando con los Materiales 3, 4 y 6.

Resolver esto me parece muy desafiante ...

¿Tienes otra idea aquí?

¡Muchas gracias!

Si desea utilizar material 2 y 6 para la simulación en el Taller C, podríamos escribir un código DAX para eso. Pero estamos utilizando los precios del taller respectivo para la simulación. Solo se utiliza la división del taller de referencia. Entonces, si no se usan 2 materiales en el Taller C, obviamente, no habrá precio disponible para esos materiales en el Taller C. Si traemos el split% del taller de referencia al Taller C, el precio estará vacío/en blanco. ¿Qué quieres hacer en esas situaciones?

Gracias por los comentarios críticos. ¡De hecho, una buena pregunta!

El objetivo general del punto de referencia es comprobar si los talleres pueden producir el producto más barato, adaptándose a la mezcla de materiales más barata (%-split). Los precios de los diferentes materiales se mantienen para todos los talleres, ya sea que actualmente utilicen el material o no. Así que sí, el cálculo utilizará los precios del taller respectivo, utilizando la división % del producto del taller más barato.

Esa era la situación de la vida real. En sus datos de muestra, podría solucionarlo fácilmente de la siguiente manera ...

En lugar de mantener sus datos como

sreenathv_0-1639034661293.png

Agréguele cero líneas y mantenga los datos como.

sreenathv_1-1639034846066.png

Solucionará el problema.

Ya veo, puedo probar esto, pero no puedo garantizarlo en mi modelo de datos de la vida real: ¿tiene otra idea en DAX?

En su última captura de pantalla, el costo simulado del producto B en el Taller C se muestra como 5.62. ¿Está correctamente calculado o está mal? ¿Puedes verificarlo?

Hi sreenathv,

El total de 5,64 es/fue correcto. Aunque las filas material 2 y 6 estaban vacías en el nivel de la fila, pero el total aún se calculó correctamente. Ahora sumando el 0% en el Split% del Taller C, también a nivel de fila termina correctamente al subtotal:

I_LOVE_POWER_BI_0-1639038741423.png

La pregunta ahora me queda, si es posible obtener el resultado para el material 2 y 6, sin el 0 en la división material-%.

¿Alguna idea de cómo hacer esto en DAX sin cambiar la tabla de datos?

¡¡¡GRACIAS!!!

No estoy pensando mucho en esto. Pero puede intentar cambiar la variable MinCostWorkshop en la medida de costo del producto simulado de la siguiente manera ...

VAR MinCostWorkshop = CALCULATE([Minimum Cost Workshop],REMOVEFILTERS(Materials[Material]))

Eso podría solucionarlo, pero asegúrese de probarlo.

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.