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...
como seria la formula si tengo una tabla de clientes con las siguientes columnas: Saldo inicial. Cargos, Abonos.. lo que quiero es hacer una formula en power pivot que me pueda dar el saldo final: Saldo inicial+Cargos-Abonos. GRACIAS
ResponderEliminarHola Cesar,
Eliminarpor que no incluyes una columna calculada que haga esa operación¿?
Luego puedes operar sobre ella en tu tabla dinámica...
Saludos
[Saldo Inicial]+[CARGOS]-[ABONOS] asi la puse en agregar columna personalizada pero solo va trabajando por fila, no va acumulando lo de la fila de arriba. la verdad soy novato en este tema de funciones. GRACIAS
ResponderEliminarHola,
Eliminarlo mejor es realizar el proceso con Power Query (echa un vistazo aquí), y leugo lo cargas en tu Power Pivot...
Seguramente se pueda hacer directamente en Power Pivot, pero será más elaborado... y en realidad pierde su sentido en esta herramienta.
Slds
Buenas tardes,
ResponderEliminarMe gustaría saber cómo puedo calcular un simil de la función sumar.si.conjunto, en este caso me encuentro calculando el indicador de OTIF, el cual requiere fecha de filtros con restricciones "menor o igual a". Por ejemplo se requiere una comparación por registro de la data de ventas vs la data de pedidos donde al OTIF sólo entraría la suma de todo lo vendido hasta antes de la fecha de entrega del pedido, pero cuando intento usar alguna de estas fórmulas aparece un error.
Espero me puedan dar un tip.
Saludos.
Hola,
Eliminarson las funciones SUM o SUMX, al aplicar los filtros finales en la tabla dinámica, actuará como un SUMAR.SI.CONJUNTO...
Ten presente que estas funciones trabajan en un contexto distinto, y no existen resultados equivalentes directos entre Excel y Power Pivot..
Slds