jueves, 28 de febrero de 2019

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)

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

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)


El resultado sobre la tabla dinámica:

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)



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.

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)



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])

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)



El resultado en la tabla dinámica:

Power Pivot: Funciones DAX como SUMX o CALCULATE (cont)



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...

6 comentarios:

  1. 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

    ResponderEliminar
    Respuestas
    1. Hola Cesar,
      por que no incluyes una columna calculada que haga esa operación¿?
      Luego puedes operar sobre ella en tu tabla dinámica...
      Saludos

      Eliminar
  2. [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

    ResponderEliminar
    Respuestas
    1. Hola,
      lo 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

      Eliminar
  3. Buenas tardes,

    Me 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.

    ResponderEliminar
    Respuestas
    1. Hola,
      son 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

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.