Terminaremos hoy con el repaso a algunas funciones DAX importantes.
Vimos en el post anterior del blog las siguientes funciones:
- RELATED
- SUM, AVERAGE, COUNT, DISTINCTCOUNT
- SUMX, AVERAGEX, COUNTX
- CALCULATE
- ALL, FILTER
Veremos en el presente artículo las tres últimas:
- CALCULATE
- ALL, FILTER
Seguiremos empleando nuestro modelo de datos, generado a partir de dos tablas ('TblVentas' y 'TblPrecios') relacionadas entre sí por el campo Item-Producto.
La función CALCULATE(expresión;filtro1;filtro2…) evalúa una expresión en un contexto que es modificado por los filtros especificados.
Como ejemplo dispondremos dos nuevas medidas:
Suma3:=CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Parcial2]))
función que nos devuelve los mismos resultados que las medidas anteriores (ver post anterior): Suma1 (con la función SUM) o Suma2 (con SUMX); esto es, la suma de Ventas según detalle o desglose de campos en la tabla dinámica.
Ventas_s/Pdtos:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Producto]))
con la que obtendremos el porcentaje o peso de cada producto calculado sobre las ventas
El resultado sobre la tabla dinámica:
la función ALL({tabla|columna[;columna[;columna[;…]]]}) que hemos usado en la medida anterior, nos devuelve todas las filas de una tabla o todos los valores de una columna, ignorando los filtros que se hayan aplicado.
Esta función es útil para borrar filtros y crear cálculos en todas las filas de una tabla.
Nuestra anterior medida:
Ventas_s/Pdtos:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Producto]))
se aplica sobre la aparición de cada producto...sobre el subtotal.
Eliminando todos los filtros de la/s columna/s especificadas en la tabla (de 'Producto' para nosotros).
Todos los demás filtros en otras columnas en la tabla todavía aplican.
OJO: Todos los argumentos de columna deben provenir de la misma tabla.
Mientras que esta:
Ventas_s/Pdtos2:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas))
se calcula de manera global, indistintamente del producto... sobre el total general.
Elimina todos los filtros de la tabla especificada. Y es que ALL(Tabla) devuelve todos los valores de la tabla, eliminando cualquier filtro del contexto que de lo contrario podría haberse aplicado.
En definitiva, la variante ALL(Columna) es útil cuando deseamos eliminar los filtros de contexto para una o más columnas específicas y mantener todos los demás filtros de contexto. Y ALL(tabla) es útil cuando trabajamos con muchos niveles de agrupación y queremos crear un cálculo que cree una relación de un valor agregado al valor total.
Una medida alternativa a la previa 'Ventas_s/Pdtos2' sería:
Ventas_s/Pdtos3:=SUMX(TblVentas;TblVentas[Unidades]*RELATED(tblPrecios[Precio Unitario]))/SUMX(all(TblVentas);TblVentas[Unidades]*RELATED(tblPrecios[Precio Unitario]))
La última función DAX por contar sería FILTER(tabla;filtro) que nos devuelve una tabla que representa un subconjunto de otra tabla o expresión.
El filtro se debe construir como una expresión booleana que se evaluará para cada fila de la tabla.
Por ejemplo, [Unidades]> 60 o [Cliente] = "Cli_1"
Crearemos una medida que nos permita conocer las ventas que superen los 100 euros:
Ventas>100:=SUMX(FILTER(TblVentas;[Parcial2]>=100);[Parcial2])
El resultado en la tabla dinámica:
Una variante...
Ventas>100_2:=CALCULATE(SUM(TblVentas[Parcial1]);FILTER(tblventas;[Parcial2]>=100))
Por supuesto existen muchísimas funciones DAX, todas ellas útiles; pero las comentadas en estas dos entradas del blgo te servirán de comienzo en el largo camino...
Vimos en el post anterior del blog las siguientes funciones:
- RELATED
- SUM, AVERAGE, COUNT, DISTINCTCOUNT
- SUMX, AVERAGEX, COUNTX
- CALCULATE
- ALL, FILTER
Veremos en el presente artículo las tres últimas:
- CALCULATE
- ALL, FILTER
Seguiremos empleando nuestro modelo de datos, generado a partir de dos tablas ('TblVentas' y 'TblPrecios') relacionadas entre sí por el campo Item-Producto.
La función CALCULATE(expresión;filtro1;filtro2…) evalúa una expresión en un contexto que es modificado por los filtros especificados.
Como ejemplo dispondremos dos nuevas medidas:
Suma3:=CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Parcial2]))
función que nos devuelve los mismos resultados que las medidas anteriores (ver post anterior): Suma1 (con la función SUM) o Suma2 (con SUMX); esto es, la suma de Ventas según detalle o desglose de campos en la tabla dinámica.
Ventas_s/Pdtos:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Producto]))
con la que obtendremos el porcentaje o peso de cada producto calculado sobre las ventas
El resultado sobre la tabla dinámica:
la función ALL({tabla|columna[;columna[;columna[;…]]]}) que hemos usado en la medida anterior, nos devuelve todas las filas de una tabla o todos los valores de una columna, ignorando los filtros que se hayan aplicado.
Esta función es útil para borrar filtros y crear cálculos en todas las filas de una tabla.
Nuestra anterior medida:
Ventas_s/Pdtos:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas[Producto]))
se aplica sobre la aparición de cada producto...sobre el subtotal.
Eliminando todos los filtros de la/s columna/s especificadas en la tabla (de 'Producto' para nosotros).
Todos los demás filtros en otras columnas en la tabla todavía aplican.
OJO: Todos los argumentos de columna deben provenir de la misma tabla.
Mientras que esta:
Ventas_s/Pdtos2:=SUM(TblVentas[Parcial2])/CALCULATE(SUM(TblVentas[Parcial2]); ALL(TblVentas))
se calcula de manera global, indistintamente del producto... sobre el total general.
Elimina todos los filtros de la tabla especificada. Y es que ALL(Tabla) devuelve todos los valores de la tabla, eliminando cualquier filtro del contexto que de lo contrario podría haberse aplicado.
En definitiva, la variante ALL(Columna) es útil cuando deseamos eliminar los filtros de contexto para una o más columnas específicas y mantener todos los demás filtros de contexto. Y ALL(tabla) es útil cuando trabajamos con muchos niveles de agrupación y queremos crear un cálculo que cree una relación de un valor agregado al valor total.
Una medida alternativa a la previa 'Ventas_s/Pdtos2' sería:
Ventas_s/Pdtos3:=SUMX(TblVentas;TblVentas[Unidades]*RELATED(tblPrecios[Precio Unitario]))/SUMX(all(TblVentas);TblVentas[Unidades]*RELATED(tblPrecios[Precio Unitario]))
La última función DAX por contar sería FILTER(tabla;filtro) que nos devuelve una tabla que representa un subconjunto de otra tabla o expresión.
El filtro se debe construir como una expresión booleana que se evaluará para cada fila de la tabla.
Por ejemplo, [Unidades]> 60 o [Cliente] = "Cli_1"
Crearemos una medida que nos permita conocer las ventas que superen los 100 euros:
Ventas>100:=SUMX(FILTER(TblVentas;[Parcial2]>=100);[Parcial2])
El resultado en la tabla dinámica:
Una variante...
Ventas>100_2:=CALCULATE(SUM(TblVentas[Parcial1]);FILTER(tblventas;[Parcial2]>=100))
Por supuesto existen muchísimas funciones DAX, todas ellas útiles; pero las comentadas en estas dos entradas del blgo te servirán de comienzo en el largo camino...