(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo calcular la rotación de inventario en DAX: paso a paso

João Barros 22 de October de 2026 5 min de lectura

Vamos a calcular la rotación de inventario en DAX para medir cuántas veces se vende el inventario en un periodo. Esta métrica ayuda a evaluar la eficiencia del stock, detectar exceso o falta de inventario y apoyar decisiones de reposición y pricing. En términos prácticos, una rotación más alta normalmente indica que el negocio está convirtiendo stock en ventas con rapidez; una rotación muy baja puede revelar exceso de stock o productos de baja rotación.

Requisitos previos

  • Power BI Desktop con un modelo simple: tablas Sales (ventas) e Inventory (inventario) y una Date table. Ej.: Sales con columnas Sales[SalesAmount], Sales[COGS], Sales[Date], Sales[ProductID]; Inventory con Inventory[StockValue], Inventory[Date], Inventory[ProductID].
  • Relaciones: Sales[Date] -> Date[Date]; Inventory[Date] -> Date[Date]; Sales[ProductID] -> Inventory[ProductID]. Asegurar que la Date table está marcada como Date table para que la Time Intelligence funcione.
  • Conocimientos básicos de DAX: medidas, CALCULATE, SUM, AVERAGE y FILTER. Es ideal tener también conciencia de los niveles de granularidad (por producto, por día, por mes).

Paso 1: Entender la fórmula de la rotación de inventario

La rotación de inventario (Inventory Turnover) normalmente = Coste de las Ventas (COGS) / Inventario Medio. Si no tiene COGS, puede usar Ventas (Revenue) como proxy — recordando que esto cambia la interpretación. Inventario Medio es frecuentemente la media entre inventario al inicio y al final del periodo, o la media diaria si hay registros por día.

Ejemplo práctico: si en un año el Total COGS = 200.000€ y el Inventario Medio = 50.000€, entonces Inventory Turnover = 200.000 / 50.000 = 4. Es decir, el stock «giró» 4 veces ese año. Para convertir a Days Inventory Outstanding (DIO): DIO = 365 / 4 = 91,25 días.

Paso 2: Crear medidas base (Sales y COGS)

Empiece por crear medidas para el total de ventas y, si existe, COGS. Estas medidas sirven de numerador en la fórmula. Verifique unidades (moneda) y que no está sumando valores duplicados por error de modelo.

Total Sales = SUM(Sales[SalesAmount])
Total COGS = SUM(Sales[COGS])

Buenas prácticas: utilice FORMAT solo en visuales. Mantenga medidas numéricas sin texto para que puedan usarse en cálculos posteriores. Si su COGS está en una tabla separada, cree relaciones o utilice CALCULATE con USERELATIONSHIP si es necesario.

Paso 3: Crear medida de inventario diario o de fin de periodo

Si la tabla Inventory tiene registros diarios por producto, es preferible calcular el Inventario Medio diario. Si solo tiene levantamientos mensuales, puede usar el stock del último día del mes (closing stock).

Closing Inventory =
CALCULATE(
    SUM(Inventory[StockValue]),
    LASTDATE(Date[Date])
)

Esta medida devuelve el stock en el último día del contexto de filtro (mes, trimestre, etc.). Ej.: en el contexto del mes de marzo, si el último día con registro es 31/03 y el stock total es 120.000€, Closing Inventory = 120.000€.

Paso 4: Medida de Inventario Medio simple (inicio + fin)

Si tiene registros de stock por día, calcule el Inventario Medio como la media del inventario diario en el periodo vía AVERAGEX sobre días. Esto da una estimación más estable, sobre todo cuando hay variaciones diarias significativas.

Average Inventory (Daily) =
AVERAGEX(
    VALUES(Date[Date]),
    CALCULATE(SUM(Inventory[StockValue]))
)

Ejemplo: si durante un mes los valores diarios del stock total son 40k, 42k, 38k, … la media diaria podría situarse en 41k. Para periodos mensuales, esta media es más representativa que solo el stock de cierre.

Paso 5: Medida de rotación de inventario (con COGS)

Ahora combine las medidas: rotación = COGS / Inventario Medio. Utilice DIVIDE para evitar división por cero y para controlar el valor devuelto cuando el denominador sea cero.

Inventory Turnover =
DIVIDE(
    [Total COGS],
    [Average Inventory (Daily)],
    BLANK()
)

-- Si usa Closing Inventory como proxy:
Inventory Turnover (Closing) =
DIVIDE(
    [Total COGS],
    [Closing Inventory],
    BLANK()
)

Ejemplo numérico: Total COGS (mes) = 50.000€, Average Inventory (Daily) = 12.500€ → Inventory Turnover = 4. Si el denominador es cero, DIVIDE devuelve BLANK() por defecto; puede sustituir por 0 si lo prefiere.

Paso 6: Ajustes por periodo y comparaciones (ej.: anual o mensual)

Normalmente se calcula la rotación por año o por mes. Use la Date table y funciones de Time Intelligence para comparar periodos. Por ejemplo, use TOTALYTD para sumar COGS hasta el fin del año y compárelo con la media de inventario del periodo correspondiente.

Total COGS YTD =
TOTALYTD([Total COGS], Date[Date])

Inventory Turnover YTD =
DIVIDE(
    [Total COGS YTD],
    [Average Inventory (Daily)],
    BLANK()
)

Considere también calcular medias móviles (3 meses, 12 meses) para suavizar la estacionalidad. Ej.: una rotación media móvil de 12 meses será menos sensible a picos estacionales en las ventas.

Verificar el resultado

Creé un visual de tabla en Power BI con Date[Year] o Date[Month] y las medidas: Total COGS, Average Inventory (Daily) e Inventory Turnover. Verifique si los valores tienen sentido: rotación muy alta (>12) puede indicar stock insuficiente (ej.: retail rápido como supermercados tiene valores elevados), rotación moderada (3–6) es común en electrónica, y muy baja (<1) indica exceso de stock (ej.: mobiliario tiende a tener valores bajos). Pruebe con filtros por ProductID para confirmar por producto. Si un producto tiene Inventory Turnover de 0, investigue los datos en Inventory o la relación entre tablas.

Conclusión

Después de implementar estas medidas puede comparar la rotación por periodo, producto o categoría y tomar decisiones de reposición, pricing y promociones. Siguiente paso: ajustar el Inventory Average a una media ponderada por ventas, calcular Days Inventory Outstanding (DIO = 365 / Turnover) o preparar alertas cuando la rotación caiga por debajo de un umbral. Consejo práctico: utilice siempre DIVIDE para evitar errores de división por cero y valide las suposiciones sobre COGS vs Revenue — si usa Revenue como proxy, documente la limitación, porque márgenes diferentes afectan la interpretación.