Power BI · Capítulo 4 · Lección de conceptos · 7 min de lectura

¿Columna calculada o medida?

DAX tiene dos tareas. Una columna calculada añade un valor guardado a cada fila al actualizar los datos; una medida se calcula al vuelo para cada celda bajo los filtros de esa celda. Una pregunta te dice cuál escribir.

La idea

DAX hace dos tareas distintas, y en pantalla se ven casi igual. Escribes Nombre = expresión, pulsas Enter y aparece algo nuevo en el panel Data. Pero el motor trata a ambas de forma opuesta.

  • Una columna calculada se evalúa una vez por fila, cuando los datos se cargan o se actualizan. El resultado se guarda en la tabla y ocupa memoria como cualquier otra columna.
  • Una medida se evalúa una vez por celda, cuando se dibuja un visual, bajo los filtros que lleva esa celda. No se guarda nada; es una fórmula esperando a que le pregunten.

Una regla elige entre ellas: si necesitas agrupar, filtrar o segmentar por ello, tiene que ser una columna. Si necesitas sumarlo o promediarlo, tiene que ser una medida.

Figura 1

Una columna calculada: un valor por fila, guardado en la tabla

products con Price Band = IF(products[unit_price] >= 100, "Premium", "Everyday")
product_idnameunit_pricePrice Band
101Vale Velvet Loveseat1659.00Premium
102Alder Oak Coffee Table919.00Premium
121Bramble Ceramic Floor Lamp31.99Everyday
154Vale Enamel Bowl Set11.99Everyday
194Chester Brass Wall Mirror159.00Premium

Paso 1 de 4 Una columna calculada se escribe una vez y se evalúa para cada fila de su tabla, una a una. DAX llama contexto de fila a la fila que se está visitando.

  1. Una columna calculada se escribe una vez y se evalúa para cada fila de su tabla, una a una. DAX llama contexto de fila a la fila que se está visitando.
  2. Para la fila 101 la fórmula ve solo el unit_price de esa fila, 1659.00. La prueba >= 100 es verdadera, así que la celda es Premium.
  3. Luego la siguiente fila: 31.99 es menos de 100, así que Everyday. El resultado se guarda en la tabla como cualquier otra columna y solo se recalcula al actualizar.
  4. Como Price Band ya son datos reales, puedes ponerla en la fila de una matriz, en una segmentación o en un filtro. Una medida no podría.

Por qué existe

Una hoja de cálculo tiene un solo tipo de fórmula: vive en una celda y muestra un valor. Las tablas de Power BI tienen miles o millones de filas, y sus preguntas son de dos tipos distintos.

Algunas preguntas son sobre una fila: "¿es premium este producto?", "¿en qué mes fue este pedido?", "¿cuánto costó esta línea?". Tienen una respuesta por fila y esa respuesta no cambia al mirar la fila desde otro gráfico. Eso es una columna.

Otras preguntas son sobre un conjunto de filas: "¿cuál es nuestro valor promedio de pedido en el canal web?". La respuesta depende de qué filas entreguen el visual, las segmentaciones y el encabezado de fila. No se puede guardar, porque no es un solo número. Eso es una medida.

Confundirlas tiene costes previsibles. Una razón construida como columna devuelve un valor por fila que la matriz solo puede sumar o promediar, y eso es incorrecto. Una banda construida como medida no puede ir en una fila ni en una segmentación, porque una medida no es una columna por la que agrupar.

Cómo funciona por dentro

Contexto de fila: la fila actual

Cuando corre una columna calculada, DAX visita las filas de la tabla una tras otra. En cada parada, esa fila es el contexto de fila (row context): products[unit_price] significa el precio de esa fila. Por eso IF, SWITCH, YEAR y MONTH funcionan directamente en una columna. Necesitan un valor, y el contexto de fila lo aporta.

El contexto de fila no lleva ningún filtro. Si una columna de orders llama a SUM(order_items[line_total]), devuelve el total general en cada fila, porque el pedido actual no filtra las líneas. Para que una fila actúe como filtro hace falta CALCULATE, que es el tema del capítulo siguiente.

Contexto de filtro: las filas de la celda

Una medida parte de la celda. El encabezado de fila, el de columna, las segmentaciones y los filtros de página forman el contexto de filtro (filter context), y la expresión de la medida corre sobre las filas que sobreviven.

Figura 2

Una medida: se recalcula en cada celda a partir de las filas de esa celda

Siete pedidos completados, marzo de 2025 (totales por pedido)
order_idchannelorder_total
8749web514.98
8750web192.59
8751app1483.99
8752web795.94
8753app3111.88
8754web1314.77
8757app55.97
Matriz por canal: Average Order Value = DIVIDE([Sales], [Orders])
channelSalesOrdersAverage Order Value
web2818.284704.57
app4651.8431550.61
Total7469.1271067.02

Paso 1 de 4 Siete pedidos. Una medida no está guardada en ninguno; solo existe cuando una celda la pide.

  1. Siete pedidos. Una medida no está guardada en ninguno; solo existe cuando una celda la pide.
  2. La fila web filtra los pedidos a channel = web: cuatro pedidos. Sales suma sus totales, 2818.28, Orders cuenta 4, y DIVIDE da 704.57.
  3. La fila app ejecuta la misma fórmula sobre otro conjunto de filas: tres pedidos, 4651.84 en ventas, 1550.61 cada uno.
  4. La fila Total no tiene filtro de canal: los siete pedidos, 7469.12 entre 7 son 1067.02. Es la medida evaluada otra vez, no la suma ni el promedio de las filas de arriba.

De aquí salen dos detalles. Primero, una medida nunca lista filas: SUM, COUNTROWS, DISTINCTCOUNT, AVERAGE, MIN y MAX reducen una columna o tabla a un solo número. Segundo, la fila Total no es una suma. Es la medida sin el filtro del encabezado de fila, y para una razón eso da una respuesta distinta de sumar las filas.

Seguir una relación en una columna

Una columna solo puede leer su propia fila, pero el modelo tiene tablas relacionadas. RELATED lee una columna del lado uno para la fila actual: Line Cost = order_items[quantity] * RELATED(products[unit_cost]). Necesita contexto de fila y sigue la relación del lado muchos al lado uno.

Medidas que llaman a medidas

Una vez que existe Sales, puedes escribir Average Order Value = DIVIDE([Sales], [Orders]). Una referencia a una medida se escribe con corchetes y sin nombre de tabla, que es como DAX separa a simple vista las columnas (tabla[columna]) de las medidas. Construye medidas pequeñas y luego compónlas. Usa DIVIDE en lugar de / para que una celda sin pedidos muestre un vacío, no un error.

Dónde crear cada una

Ambas empiezan en el mismo sitio. En Power BI Desktop, selecciona una tabla en el panel Data y elige Table tools → New column o New measure (una medida puede vivir en cualquier tabla, porque no es una columna de ella). En Table view verás los valores de una columna; nunca verás los de una medida.

Una prueba rápida antes de escribir

Hazte dos preguntas. ¿Necesito este valor en un encabezado de fila, una segmentación o un filtro? Entonces es una columna. ¿Su respuesta cambia según la celda donde está? Entonces es una medida. Una banda de precio, un mes de pedido y un costo de línea pasan la primera prueba. Clientes que compraron, rango de precios y valor promedio de pedido pasan la segunda. Si ambas respuestas son no, probablemente necesitas otra medida o ninguna.

Errores comunes

"Una medida es solo una columna que se calcula más tarde"

Son objetos distintos. Una columna es dato: tiene un valor por fila y se guarda. Una medida no tiene valor propio, solo un resultado para un contexto dado. La misma medida puede mostrar 704.57 en una celda y 1550.61 en la siguiente. Una columna no puede cambiar así.

"La haré columna para que sea más rápido"

Una columna se calcula al actualizar y ocupa memoria en cada fila, incluidas las que nadie mira. Una medida no cuesta nada hasta que una celda la pide. Para cualquier cosa que agregues, una medida suele ser más pequeña y además correcta. Recurre a una columna cuando el valor sea una propiedad de la fila y necesites agrupar o filtrar por él.

"La fila Total suma las filas de arriba"

Ejecuta la medida otra vez, sin el filtro del encabezado de fila. Para Sales el resultado coincide con la suma. Para Average Order Value no: 1067.02 no es la suma de 704.57 y 1550.61 ni su promedio, porque es el promedio sobre los siete pedidos.

Ponte a prueba

Una pregunta. Al responderla, la lección queda marcada en el mapa; nunca bloquea un nivel.

Una matriz tiene channel en las filas y quieres el valor promedio de pedido de cada canal. Escribes AOV = DIVIDE(SUM(order_items[line_total]), COUNTROWS(orders)) como columna calculada en orders. ¿Qué obtienes?

Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.