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

Coste total por fecha de validez

Hola, estoy tratando de calcular el costo total basado en un precio de fecha de validación específica:

ITEM_NOFROM_DATETO_DATEPrecio principal Total QTYCosto total
8916318/09/202030/03/2021 $ 9,2350 $ 461.5
8916330/03/202101/05/2021 $ 9,81100 $ 981.0
8916301/05/202131/12/9999 $ 9,66150 $ 1,449.0

Estoy después del siguiente resultado:

Si la fecha de HOY está entre [FROM_DATE] y [TO_DATE], [Precio principal] * [Cantidad total]. Aquí el resultado sería la fila verde, $461.5 Pero, tan pronto como lleguemos al 30 de marzo, yo esperaría obtener la fila azul como resultado, $981 y así sucesivamente. En este ejemplo, tengo 3 fechas diferentes para el mismo ITEM_NO pero en otros casos tengo 2; 4; 5 y más intervalos de fechas por lo tanto debe ser "looping" hasta que consigue una coincidencia básicamente.

Además, durante algunos ITEM_NO, [FROM_DATE] y [TO_DATE] ya están en el pasado, si este es el caso, quiero capturar el último [Precio principal] disponible.

Espero que esté claro por favor, hágamelo saber y trataré de explicarlo mejor.

Muchas gracias de antemano,

Salud.

2 ACCEPTED SOLUTIONS
Syndicate_Admin
Administrator
Administrator

No @alan7lp,

Prueba esta medida. Puede jugar con diferentes fechas estableciendo la variable vToday.

Total Cost = 
VAR vToday =
    TODAY()
    --DATE(2021, 3, 31)
VAR vCurrentItem =
    MAX ( Items[ITEM_NO] )
VAR vRowInDateRange =
    FILTER ( Items, vToday >= Items[FROM_DATE] && vToday <= Items[TO_DATE] )
VAR vResultInDateRange =
    SUMX ( vRowInDateRange, Items[Main Price] * Items[Total QTY] )
VAR vItemMaxDate =
    CALCULATE ( MAX ( Items[TO_DATE] ) )
VAR vRowWithMaxDate =
    FILTER ( Items, Items[TO_DATE] = vItemMaxDate )
VAR vResultWithMaxDate =
    SUMX ( vRowWithMaxDate, Items[Main Price] * Items[Total QTY] )
VAR vResult =
    IF ( ISBLANK ( vResultInDateRange ), vResultWithMaxDate, vResultInDateRange )
RETURN
    vResult

View solution in original post

@alan7lp,

Prueba esta medida. Hay algunas diferencias en comparación con su resultado de ejemplo, como SUPPLIER 16230 / ITEM_NO 274028 (su ejemplo muestra FALSE para cada fila, pero no debería usar el precio más reciente ya que hoy no está entre cualquier FROM_DATE / TO_DATE?).

Total Cost = 
VAR vToday =
    --TODAY()
    DATE ( 2021, 2, 18 )
VAR vMainPrice =
    MAX ( Items[Main Price] )
VAR vTotalQty =
    SUM ( Items[Total QTY] )
VAR vLatestToDate =
    CALCULATE (
        MAX ( Items[TO_DATE] ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] )
    )
VAR vLatestPrice =
    CALCULATE (
        MAX ( Items[Main Price] ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] ),
        Items[TO_DATE] = vLatestToDate
    )
VAR vNumRowsTodayInRange =
    CALCULATE (
        COUNTROWS ( Items ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] ),
        vToday >= Items[FROM_DATE]
            && vToday <= Items[TO_DATE]
    )
VAR vResult =
    SWITCH (
        TRUE (),
        --if vToday is between FROM_DATE / TO_DATE, use current price
        vToday >= MAX ( Items[FROM_DATE] )
            && vToday <= MAX ( Items[TO_DATE] ), vMainPrice * vTotalQty,
        --if vToday is not between any FROM_DATE / TO_DATE, use latest price
        vNumRowsTodayInRange = 0
            && MAX ( Items[TO_DATE] ) = vLatestToDate, vLatestPrice * vTotalQty
    )
RETURN
    vResult

DataInsights_0-1621865955183.png

View solution in original post

6 REPLIES 6
Syndicate_Admin
Administrator
Administrator

No @alan7lp,

Prueba esta medida. Puede jugar con diferentes fechas estableciendo la variable vToday.

Total Cost = 
VAR vToday =
    TODAY()
    --DATE(2021, 3, 31)
VAR vCurrentItem =
    MAX ( Items[ITEM_NO] )
VAR vRowInDateRange =
    FILTER ( Items, vToday >= Items[FROM_DATE] && vToday <= Items[TO_DATE] )
VAR vResultInDateRange =
    SUMX ( vRowInDateRange, Items[Main Price] * Items[Total QTY] )
VAR vItemMaxDate =
    CALCULATE ( MAX ( Items[TO_DATE] ) )
VAR vRowWithMaxDate =
    FILTER ( Items, Items[TO_DATE] = vItemMaxDate )
VAR vResultWithMaxDate =
    SUMX ( vRowWithMaxDate, Items[Main Price] * Items[Total QTY] )
VAR vResult =
    IF ( ISBLANK ( vResultInDateRange ), vResultWithMaxDate, vResultInDateRange )
RETURN
    vResult

Hola amigo,

¡Funciona maravillas, increíble! ¡Gracias por tu ayuda!

Editar:

No @DataInsights,

Ahora he descubierto que tengo un paso más para ir y aquí mis disculpas como no lo mencioné antes.

Actualmente la medida está teniendo en cuenta ITEM_NO sin embargo tengo otro column de SUPPLIER. En este caso el mismo ITEM_NO puede pertenecer a 1 o más proveedores y tener su propio precio, ver tabla a continuación:

Actual:

1.png

Con su solución, obtengo el resultado adecuado, pero sólo si el ITEM_NO pertenece a un solo PROVEEDOR. En el ejemplo anterior, una respuesta correcta debe mostrar el precio basado en la lógica actual de su solución, pero también teniendo en cuenta el número SUPPLIER

Resultado deseado:

2.png

¿Es posible, por favor?

Si no una explicación clara hágamelo saber tan bien así que trato de hacerlo más claro.

Gracias de antemano,

Salud.

No @alan7lp,

Aquí están los datos de ejemplo que creé, junto con el resultado. ¿Es esto correcto? De lo contrario, proporcionaría datos de muestra más precisos (necesitan varios SUPPLIER y ITEM_NO), junto con el resultado esperado.

DataInsights_0-1613663029565.png

DataInsights_1-1613663055690.png

Hola @DataInsights,
1º que nada, gracias por el tiempo invertido en ayudar! Muy apreciado.

Por encima de la solución está cerca aunque puedo ver un error:
PROVEEDOR 13662 ARTÍCULO 89163 está seleccionando 9,81 precio, pero las fechas de ese precio es en el futuro. Debería estar seleccionando 9.23 donde HOY está entre el rango de fechas.

Estoy compartiendo a continuación una muestra extendida para usarla como fuente de datos:

ProveedorITEM_NOFROM_DATETO_DATEPrecio principal Total QTY
136628916318/09/202030/03/2021$9.00100
136628916330/03/20211/05/2021$10.00100
16230891631/05/202031/12/2020$9.50100
162308916331/12/20201/02/2021$11.00100
162302740285/08/20192/09/2019$18.50100
162302740282/09/201926/11/2019$19.00100
128792740282/09/201926/11/2019$20.00100
162302740665/08/20192/09/2019$7.50100
162302740662/09/201926/11/2019$8.00100
136622740665/08/20192/09/2021$7.00100
136622740662/09/202131/12/9999$9.00100
162302740855/08/20192/09/2019$11.00100
162302740852/09/201926/11/2021$12.00100
128792740855/08/20192/09/2019$13.00100
128792740852/09/201931/12/9999$14.00100
136622756075/08/20192/09/2019$12.00100
136622756072/09/20196/01/2020$12.50100
136622756076/01/202024/02/2020$13.00100
1287927560724/02/20204/05/2021$13.50100
128792756074/05/202118/05/2022$14.00100
1623027560718/05/202027/07/2020$14.00100
1623027560727/07/202031/12/9999$15.00100

El resultado esperado:
Si la fecha de HOY es entre [FROM_DATE] y [TO_DATE], [Precio principal] * [QTY total]

Si la fecha de HOY NO está entre [FROM_DATE] y [TO_DATE], capture lo último disponible [Precio principal] y, a continuación, [Precio principal] * [QTY total]

Esto debe tener en cuenta que 1 artículo puede ser compartido por muchos proveedores. Si se comparte, debería obtener un resultado por ARTÍCULO, pero también por PROVEEDOR. Vea la imagen a continuación para obtener el resultado esperado:
Result.png

Espero que esto sea lo suficientemente claro 🙂

¡Gracias una vez más compañero!

Salud

@alan7lp,

Prueba esta medida. Hay algunas diferencias en comparación con su resultado de ejemplo, como SUPPLIER 16230 / ITEM_NO 274028 (su ejemplo muestra FALSE para cada fila, pero no debería usar el precio más reciente ya que hoy no está entre cualquier FROM_DATE / TO_DATE?).

Total Cost = 
VAR vToday =
    --TODAY()
    DATE ( 2021, 2, 18 )
VAR vMainPrice =
    MAX ( Items[Main Price] )
VAR vTotalQty =
    SUM ( Items[Total QTY] )
VAR vLatestToDate =
    CALCULATE (
        MAX ( Items[TO_DATE] ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] )
    )
VAR vLatestPrice =
    CALCULATE (
        MAX ( Items[Main Price] ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] ),
        Items[TO_DATE] = vLatestToDate
    )
VAR vNumRowsTodayInRange =
    CALCULATE (
        COUNTROWS ( Items ),
        ALLEXCEPT ( Items, Items[SUPPLIER], Items[ITEM_NO] ),
        vToday >= Items[FROM_DATE]
            && vToday <= Items[TO_DATE]
    )
VAR vResult =
    SWITCH (
        TRUE (),
        --if vToday is between FROM_DATE / TO_DATE, use current price
        vToday >= MAX ( Items[FROM_DATE] )
            && vToday <= MAX ( Items[TO_DATE] ), vMainPrice * vTotalQty,
        --if vToday is not between any FROM_DATE / TO_DATE, use latest price
        vNumRowsTodayInRange = 0
            && MAX ( Items[TO_DATE] ) = vLatestToDate, vLatestPrice * vTotalQty
    )
RETURN
    vResult

DataInsights_0-1621865955183.png

¡Funciona perfectamente!

¡Gracias amigo!

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.