Uso de FIFO en el cálculo

Un usuario Pregunto ✅

Draj

¡Hola a todos!

Tengo un problema único que me gustaría resolver y definitivamente agradecería cualquier ayuda. Tengo una muestra de datos como a continuación:

Cálculo de costo promedio 1

Captura de pantalla 2020-05-28 a las 9.03.19 AM.png

Cálculo de costo promedio 2

Captura de pantalla 2020-05-28 a las 9.03.28 AM.png

Aquí tengo 2 ejemplos de cálculo de costo promedio, sin embargo, necesito lograr el Cálculo de costo promedio 2.

En este ejemplo, el costo total es Unit_Cost_Price * Cantidad + Tarifa (que es la columna más a la derecha)

La forma fácil de calcular el costo promedio sería sumar el costo total y dividirlo por la suma de la cantidad (que es el cálculo 1)

Sin embargo, necesito lograr el cálculo usando FIFO, donde los primeros 2 artículos se ignoran (los artículos se ordenan por fecha del más antiguo al más nuevo) ya que la cantidad se cancela entre sí y el costo promedio se calcula después.

Definitivamente agradecería cualquier sugerencia para lograr esto en powerbi

En respuesta a Draj

Hola, @draj

Según su descripción, creé datos para reproducir su escenario. El archivo pbix se adjunta al final.

Tabla:

a1.png

Puede crear columnas y medidas calculadas como se muestra a continuación.

Calculated column:
Running Qty = 
var _date="Table"[Date]
var _lastdate =
CALCULATE(
    MAX('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]<_date&&
        'Table'[Quantity]<0
        
    )
)
var _startdate = 
CALCULATE(
    MIN('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]>_lastdate
    )
)
return
IF(
    ISBLANK(_lastdate),
    CALCULATE(
        SUM('Table'[Quantity]),
        FILTER(
            ALL('Table'),
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    ),
    CALCULATE(
        SUM('Table'[Quantity]),
        FILTER(
            ALL('Table'),
            'Table'[Date]>=_startdate&&
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    )
) 
Running Cost = 
var _date="Table"[Date]
var _lastdate =
CALCULATE(
    MAX('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]<_date&&
        'Table'[Quantity]<0
        
    )
)
var _startdate = 
CALCULATE(
    MIN('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]>_lastdate
    )
)
return
IF(
    ISBLANK(_lastdate),
    CALCULATE(
        SUM('Table'[Total Cost]),
        FILTER(
            ALL('Table'),
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    ),
    CALCULATE(
        SUM('Table'[Total Cost]),
        FILTER(
            ALL('Table'),
            'Table'[Date]>=_startdate&&
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    )
) 

Measure:
avg 1 = SUM('Table'[Total Cost])/SUM('Table'[Quantity])
avg 2 = 
var _maxdate = 
CALCULATE(
    MAX('Table'[Date]),
    ALL('Table')
)
return
DIVIDE(
    LOOKUPVALUE('Table'[Running Cost],'Table'[Date],_maxdate),
    LOOKUPVALUE('Table'[Running Qty],'Table'[Date],_maxdate)
)

Resultado:

a2.png

Atentamente

Alano

Si esta publicación ayuda, entonces por favor considere Acéptalo como la solución. para ayudar a los otros miembros a encontrarlo más rápidamente.

greg_deckler

@draj: desea buscar Min/Max https://community.powerbi.com/t5/Quick-Measures-Gallery/Lookup-Min-Max/mp/985814#M434

Usted «buscará» su fecha máxima y luego la usará para obtener sus otros dos valores.

Draj

En respuesta a greg_deckler

@Greg_Deckler No busco en función de la fecha máxima. Supongamos que hay 2 más después de la tercera entrada y que la cantidad es positiva. El objetivo es luego calcular el promedio basado en estas 3 entradas (1 actual + 2 nuevas entradas)

greg_deckler

En respuesta a Draj

@draj: eso ciertamente no apareció en la publicación original y todavía no estoy seguro de tener claro el requisito. Entonces, ¿estás diciendo que quieres entradas después de la última entrada negativa? Todavía me parece Lookup Min/Max si ese es el caso. Busque la fecha MAXX de todos los valores negativos. Use esa fecha en su filtro para filtrar las filas posteriores a esa fecha. Luego puede hacer el SUMX apropiado, etc. en esas filas FILTRADAS.

Draj

En respuesta a greg_deckler

@Greg_Deckler Gracias por sus comentarios. Déjame ir con más detalle.

Presentaré una llamada de columna que ejecuta QTY, lo que tendría más sentido ya que explica el concepto de FIFO

Captura de pantalla 2020-05-28 a las 10.18.21 AM.png

Echemos un vistazo a estas 3 entradas, que han sido ordenadas por fecha (antigua a nueva). Tenemos una columna de cantidad corriente. En este momento, la forma correcta de calcular el costo promedio sería ignorar los primeros 2 artículos (ya que la cantidad se cancela entre sí) y solo considerar la última entrada.

Ahora veamos un escenario donde se agrega otra entrada, aumentando la cantidad:

Captura de pantalla 2020-05-28 a las 10.18.32 AM.png

Así que aquí tenemos el artículo 4, y la cantidad corriente ahora es 2.000.000. El costo promedio ahora se calcula como (Costo total de 3 y 4)/(Última cantidad acumulada).

Puede ver que es más dinámico que el cálculo promedio habitual (SUMA de costo total / SUMA de cantidad)

En respuesta a Draj

Hola, @draj

Según su descripción, creé datos para reproducir su escenario. El archivo pbix se adjunta al final.

Tabla:

a1.png

Puede crear columnas y medidas calculadas como se muestra a continuación.

Calculated column:
Running Qty = 
var _date="Table"[Date]
var _lastdate =
CALCULATE(
    MAX('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]<_date&&
        'Table'[Quantity]<0
        
    )
)
var _startdate = 
CALCULATE(
    MIN('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]>_lastdate
    )
)
return
IF(
    ISBLANK(_lastdate),
    CALCULATE(
        SUM('Table'[Quantity]),
        FILTER(
            ALL('Table'),
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    ),
    CALCULATE(
        SUM('Table'[Quantity]),
        FILTER(
            ALL('Table'),
            'Table'[Date]>=_startdate&&
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    )
) 
Running Cost = 
var _date="Table"[Date]
var _lastdate =
CALCULATE(
    MAX('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]<_date&&
        'Table'[Quantity]<0
        
    )
)
var _startdate = 
CALCULATE(
    MIN('Table'[Date]),
    FILTER(
        ALL('Table'),
        'Table'[Date]>_lastdate
    )
)
return
IF(
    ISBLANK(_lastdate),
    CALCULATE(
        SUM('Table'[Total Cost]),
        FILTER(
            ALL('Table'),
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    ),
    CALCULATE(
        SUM('Table'[Total Cost]),
        FILTER(
            ALL('Table'),
            'Table'[Date]>=_startdate&&
            'Table'[Date]<=EARLIER('Table'[Date])
        )
    )
) 

Measure:
avg 1 = SUM('Table'[Total Cost])/SUM('Table'[Quantity])
avg 2 = 
var _maxdate = 
CALCULATE(
    MAX('Table'[Date]),
    ALL('Table')
)
return
DIVIDE(
    LOOKUPVALUE('Table'[Running Cost],'Table'[Date],_maxdate),
    LOOKUPVALUE('Table'[Running Qty],'Table'[Date],_maxdate)
)

Resultado:

a2.png

Atentamente

Alano

Si esta publicación ayuda, entonces por favor considere Acéptalo como la solución. para ayudar a los otros miembros a encontrarlo más rápidamente.

Draj

En respuesta a v-alq-msft

@v-alq-msft Muchas gracias!!

greg_deckler

En respuesta a Draj

@draj – Entonces, ¿por qué no usar la Medida rápida total acumulada que está integrada en Power BI para crear esa columna? Y probablemente otra columna de total acumulado para Costo total. Entonces realmente es una situación de búsqueda mínima/máxima ya que su última fecha tendrá los totales que desea.

Deja un comentario

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