Las columnas calculadas poseen las siguientes características:
- Su definición aplica para todos los registros de la tabla que la contiene y se calculan registro a registro.
- Se construyen con una expresión DAX, cuya función debe retornar un valor simple.
- Los valores de estas columnas se calculan al actualizar el modelo de datos, manteniéndose estáticas hasta la próxima actualización.
- Ocupan memoria, su calculo es persistido físicamente.
- Son útiles para agrupaciones, filtros o como punto intermedio de un calculo complejo.
- Tienen la potencia que pueden calcularse a partir de cualquier otras tablas y columnas del modelo, independiente del origen de cada una.
- Los nombres de columnas son únicos dentro de la tabla que las contiene.
El mayor potencial de la columnas calculadas se logra cuando nuestro modelo posee datos importados, en cambio cuando trabajamos en modo DirectQuery las columnas calculadas poseen una capacidad mas limitada.
La sintaxis para definir una columna calculada es
NombreDeColumna = ExpresionDAX
un ejemplo sencillo:
DiaDeSemana = WEEKDAY( [OrderDate])
En este caso la columna se llamara «DiaDeSemana» y almacenara valores del 1 al 7 correspondiente al día de semana de la columna «OrderDate»
otro ejemplo podría ser
VentasTotal = [OrderQuantity] * [UnitPrice]
en este caso estamos calculando una columna como el producto de otras dos, como podría ser Cantidad x Precio, para obtener el monto de las ventas
Tambien es posible que una columna de una tabla guarde el resultado de una expresión sobre una segunda tabla, por ejemplo
VentasTotal = SUMX( Sales, Sales[UnitPrice] * Sales[OrderQuantity] )
En este caso si la columna la alojamos en la tabla clientes por ejemplo, estaremos calculando una columna que contendrá el total de las ventas de la tabla Sales, para ser mas exacto, estamos diciéndole que recorra la tabla Sales y realice el producto de dos columnas y los sume.
Veremos lo siguiente:
Como se puede observar como estamos calculando valores basados en otra tabla, cada fila posee el mismo valor, pues nuestra expresión esta diciendo para cada fila en la tabla «Customer», itera (SUMX) sobre la tabla «Sales», realiza el producto de «Quantity» y «Unit Price» y súmalo (SUMX)
Ahora si en cambio escribimos lo siguiente
VentasTotalCliente = SUMX( RELATEDTABLE( Sales), Sales[UnitPrice] * Sales[OrderQuantity])
lo que obtenemos es
En este caso estamos diciéndole que al iterar (SUMX) lo realice sobre los registros relacionados (RELATEDTABLE).
Ahora sirve tener estas dos columnas de ventas como columnas del cliente?, y la respuesta seria «depende», quizás con unas medidas logremos lo buscando, sin ocupar espacio, y teniendo otros beneficios adicionales.
Para novatos la sugerencia seria traten de armar «medidas», excepto que lo que necesiten sea una «columna calculada», pero no apliquen el pensamiento opuesto…