El "Lado B" de DAX en cálculos visuales.
Medidas Semi-aditivas Lenguaje DAX con Cálculos Visuales.
Medidas Semi-aditivas Lenguaje DAX con Cálculos Visuales
Dominando las Métricas Semi-Aditivas en DAX: El Caso del Stock de Inventario
¡Hola, entusiastas de los datos! Bienvenidos a otra entrega donde exploramos las profundidades del Lenguaje DAX en Power BI. Hoy, vamos a abordar un concepto crucial pero a menudo malinterpretado: las métricas semi-aditivas. Si alguna vez te has enfrentado a calcular el stock de inventario, saldos de cuentas bancarias, o cualquier métrica que represente un estado en un momento dado, ¡este artículo es para ti!
¿Qué Son las Métricas Semi-Aditivas y Por Qué Deberían Importarte?
En el mundo del análisis de datos, no todas las métricas se comportan igual.
- Métricas Aditivas: Son aquellas que pueden sumarse con sentido a través de cualquier dimensión (tiempo, producto, región, etc.). Por ejemplo, las ventas totales son la suma de ventas individuales.
- Métricas Semi-Aditivas: Son aditivas a través de algunas dimensiones, pero no de todas. El ejemplo clásico es el stock de inventario. Puedes sumar el stock de diferentes productos o almacenes para un día específico, pero no tiene sentido sumar el stock del lunes con el stock del martes para obtener el “stock total” de esos dos días. El stock es una foto en un momento del tiempo.
- Métricas No Aditivas: No se pueden sumar con sentido a través de ninguna dimensión (ej. porcentajes, ratios).
Entender esto es vital porque aplicar una simple suma (SUM) a una métrica semi-aditiva a lo largo de una dimensión como el tiempo (por ejemplo, en un total general de un informe mensual) te dará un resultado incorrecto y engañoso.
El Escenario: Control de Inventario
Para ilustrarlo, trabajaremos con un modelo de datos sencillo en Power BI que puedes descargar (¡busca el enlace en la descripción original del video!). Consta de dos tablas principales:
Inventario
: Esta es una tabla de snapshots o “fotos” del inventario. Cada fila registra la cantidad de un producto específico, en un almacén determinado, en una fecha de corte (Fecha_Snapshot
).Fecha_Snapshot
: La fecha en que se tomó la “foto” del inventario.ID_Producto
: Identificador del producto.Nombre_Producto
: Descripción del producto (ej. “Camiseta algodón Talla M”).Almacen
: El almacén donde se encuentra el stock (ej. “Principal”, “Sucursal Norte”).Cantidad_Stock
: Las unidades disponibles de ese producto, en ese almacén, en esa fecha.
Inventario
) Fecha_Snapshot ID_Producto Nombre_Producto Almacen Cantidad_Stock 01/05/2024 PROD001 Camiseta algodón Talla M Principal 250 01/05/2024 PROD002 Pantalón Jean Talla 32 Principal 150 01/05/2024 PROD001 Camiseta algodón Talla M Sucursal Norte 75 02/05/2024 PROD001 Camiseta algodón Talla M Principal 230 … … … … …Fechas
: Una tabla de calendario estándar, relacionada conInventario
a través deFechas[Fecha]
(lado 1) yInventario[Fecha_Snapshot]
(lado muchos). (Visualización del Modelo de Datos)Fechas (1) <--- (*) Inventario
El Problema Común: La Suma Ingenua
Si queremos ver el stock por fecha, podríamos crear una medida simple:
1 | #sumStock = 2 | SUM ( Inventario[Cantidad_Stock] )
Y la llevamos a una matriz la columna de Fechas de la tabla de Fechas al área des filas:

A nivel de cada fecha individual, el valor es correcto (ej. 475 es la suma del stock de todos los productos y almacenes para el 01/05/2024). ¡Pero mira el total! 2045. ¿Qué significa este número? Es la suma de los stocks de cada día. Desde una perspectiva de negocio, si te preguntan “¿cuál es el stock al final de este período?”, la respuesta no es 2045. La respuesta debería ser el stock del último día registrado, en este caso, 550.
La Solución: Aprovechando los Cálculos Visuales
Power BI nos ofrece una forma elegante de manejar esto directamente en el visual con los “Cálculos Visuales”. Aquí, podemos definir una lógica diferente para el total.
- Selecciona la Matriz y ve a la pestaña “Inicio” > grupo “Cálculos” > “Nuevo cálculo visual”.
- Nombraremos nuestro nuevo cálculo visual
#Stock
. - La lógica será:
- Si estamos a nivel de detalle de una fecha, muestra la suma normal del stock para esa fecha.
- Si estamos en el total (o un subtotal de fecha), muestra el stock del último día visible en ese contexto.
Usaremos la función ISATLEVEL para distinguir entre el detalle y el total, y EXPAND con LAST para obtener el valor del último día.
1 | #Stock = 2 | IF (3 | ISATLEVEL ( [Fecha] ),4 | [#Stock],5 | EXPAND ( LAST ( [#Stock] ), ROWS, 1 )6 | )
Explicación del DAX Visual:
ISATLEVEL([Fecha])
: Esta función devuelveTRUE
cuando la fila actual en la matriz visual corresponde a un valor individual de la columna[Fecha]
. Para la fila “Total”, devolveráFALSE
.[#sumStock]
: Hace referencia a la columna visual#sumStock
que ya existe en nuestro visual. En los cálculos visuales, podemos referenciar otras columnas ya presentes en la tabla visual.LAST([#sumStock])
: Dentro de la funciónEXPAND
,LAST
identifica el último valor de#sumStock
visible en el contexto visual.EXPAND(..., ROWS, 1)
: Desplaza a un detalle mayor en el reticulado de tablar virtual, modificando así el contexto visual navegando porROWS
(filas) y expandiendo un nivel (1
).

¡Ahora sí! El total de #Stock (550) refleja correctamente el inventario disponible al final del período mostrado, que es el valor del último día (04/05/2024).
Puntos Clave y Próximos Pasos
- Snapshots vs. Transacciones: El stock de inventario es un snapshot. No se suma a través del tiempo.
- Lógica de Negocio: El total general para el stock usualmente requiere el valor del último período, no una suma de snapshots.
- Cálculos Visuales: Ofrecen una forma poderosa de modificar el comportamiento de los totales y subtotales directamente en el visual, usando funciones como
ISATLEVEL
,EXPAND
,COLLAPSE
,LAST
,FIRST
, etc. - Retícula de Tabla Virtual: Los cálculos visuales operan sobre la estructura de datos del propio visual (la “retícula de tabla virtual”).
Esta es solo una introducción a las métricas semi-aditivas y cómo los cálculos visuales pueden ayudar. Existen otras formas de abordar esto a nivel de modelo DAX (con LASTDATE, LASTNONBLANK, etc), cada una con sus matices y casos de uso.
Te invito a profundizar en estos temas. Si quieres dominar el Lenguaje DAX y entender a fondo cómo resolver estos y otros escenarios complejos, echa un vistazo al Magister en Lenguaje DAX en Power Elite Studio. Encontrarás módulos dedicados a métricas semi-aditivas y mucho más.
¿Qué te ha parecido? ¿Cómo resuelves tú este tipo de escenarios? ¡Déjanos tus comentarios!
1 |