Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.
Hola, estoy tratando de calcular el costo total basado en un precio de fecha de validación específica:
ITEM_NO | FROM_DATE | TO_DATE | Precio principal | Total QTY | Costo total |
89163 | 18/09/2020 | 30/03/2021 | $ 9,23 | 50 | $ 461.5 |
89163 | 30/03/2021 | 01/05/2021 | $ 9,81 | 100 | $ 981.0 |
89163 | 01/05/2021 | 31/12/9999 | $ 9,66 | 150 | $ 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.
Solved! Go to Solution.
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
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
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:
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:
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:
¿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.
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:
Proveedor | ITEM_NO | FROM_DATE | TO_DATE | Precio principal | Total QTY |
13662 | 89163 | 18/09/2020 | 30/03/2021 | $9.00 | 100 |
13662 | 89163 | 30/03/2021 | 1/05/2021 | $10.00 | 100 |
16230 | 89163 | 1/05/2020 | 31/12/2020 | $9.50 | 100 |
16230 | 89163 | 31/12/2020 | 1/02/2021 | $11.00 | 100 |
16230 | 274028 | 5/08/2019 | 2/09/2019 | $18.50 | 100 |
16230 | 274028 | 2/09/2019 | 26/11/2019 | $19.00 | 100 |
12879 | 274028 | 2/09/2019 | 26/11/2019 | $20.00 | 100 |
16230 | 274066 | 5/08/2019 | 2/09/2019 | $7.50 | 100 |
16230 | 274066 | 2/09/2019 | 26/11/2019 | $8.00 | 100 |
13662 | 274066 | 5/08/2019 | 2/09/2021 | $7.00 | 100 |
13662 | 274066 | 2/09/2021 | 31/12/9999 | $9.00 | 100 |
16230 | 274085 | 5/08/2019 | 2/09/2019 | $11.00 | 100 |
16230 | 274085 | 2/09/2019 | 26/11/2021 | $12.00 | 100 |
12879 | 274085 | 5/08/2019 | 2/09/2019 | $13.00 | 100 |
12879 | 274085 | 2/09/2019 | 31/12/9999 | $14.00 | 100 |
13662 | 275607 | 5/08/2019 | 2/09/2019 | $12.00 | 100 |
13662 | 275607 | 2/09/2019 | 6/01/2020 | $12.50 | 100 |
13662 | 275607 | 6/01/2020 | 24/02/2020 | $13.00 | 100 |
12879 | 275607 | 24/02/2020 | 4/05/2021 | $13.50 | 100 |
12879 | 275607 | 4/05/2021 | 18/05/2022 | $14.00 | 100 |
16230 | 275607 | 18/05/2020 | 27/07/2020 | $14.00 | 100 |
16230 | 275607 | 27/07/2020 | 31/12/9999 | $15.00 | 100 |
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:
Espero que esto sea lo suficientemente claro 🙂
¡Gracias una vez más compañero!
Salud
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
¡Funciona perfectamente!
¡Gracias amigo!
User | Count |
---|---|
2 | |
2 | |
1 | |
1 | |
1 |