martes, 25 de mayo de 2021

Power Pivot-DAX: Medias Ponderadas Parciales y Totales

En la entrada anterior del blog hablamos sobre la función DAX: HASONEVALUE, interesante función que identificaba situaciones únicas, esto es, donde en el contexto de filtro aparecía una única vez un elemento determinado.

Hoy aplicaremos un caso en Power Pivot para procesar un cálculo de precio medio ponderado parcial o total según la coincidencia o no de ese elemento único.
La idea es obtener el Precio Medio Ponderado Parcial cuando el número de clientes para un artículo es mayor que uno, y en caso que el artículo solo se haya vendido a un único cliente, tomar el Precio Medio Ponderado General (de todas las ventas)

Partiremos de dos tablas cargadas en nuestro modelo de datos:
-Tabla Ventas (Tabla1)
-Tabla Precios (TblPRECIOS)
Ambas relacionadas por el código de artículo (por ejemplo desde la Vista de diagrama del editor de Power Pivot).
Power Pivot-DAX: Medias Ponderadas Parciales y Totales

Y dentro de la Tabla de ventas ('Tabla1') en su área de cálculo incorporamos las siguientes medidas:
Total_Unidades:=SUM(Tabla1[Unidades])						
Total_Ventas:=SUMX(Tabla1;Tabla1[Unidades]*RELATED(TblPRECIOS[Precio_Unitario]))						
IF_HOV2:=IF(HASONEVALUE(Tabla1[Cliente]);
        CALCULATE(SUMX(ALL(Tabla1);[Total_Ventas])/SUMX(ALL(Tabla1);[Total_Unidades]));
        [Total_Ventas]/[Total_Unidades])

Power Pivot-DAX: Medias Ponderadas Parciales y Totales

Las dos primeras medidas:
Total_Unidades:=SUM(Tabla1[Unidades])
Total_Ventas:=SUMX(Tabla1;Tabla1[Unidades]*RELATED(TblPRECIOS[Precio_Unitario]))
funcionarán en la tabla dinámica dentro del contexto de filtro aplicado, por tanto se ajustará el cálculo (en nuestro ejemplo) al artículo listado... y en su caso al Trimestre seleccionado (en realidad, a cualquier filtro de cualquier campo que se incluya en la tabla dinámica).

Mientras que la tercera medida se encarga de forzar un cálculo parcial u otro total, aplicando un condicional IF con nuestra función DAX: HASONEVALUE:
IF_HOV2:=IF(HASONEVALUE(Tabla1[Cliente]);
CALCULATE(SUMX(ALL(Tabla1);[Total_Ventas])/SUMX(ALL(Tabla1);[Total_Unidades]));
[Total_Ventas]/[Total_Unidades])

La opción de 'verdadero' de nuestro condicional, i.e., cuando exista un solo cliente, retorna el cálculo ponderado: Total_ventas / Total_Unidades... pero usando la función ALL, de la que sabemos que devuelve todas las filas de una tabla (o en su caso, todos los valores de una columna) omitimos los filtros que se puedan haber aplicado... muy útil para borrar filtros y crear cálculos en todas las filas de una tabla:
CALCULATE(SUMX(ALL(Tabla1);[Total_Ventas])/SUMX(ALL(Tabla1);[Total_Unidades]));
Nota: podríamos omitir el uso de CALCULATE... pero aporta flexibilidad en caso de que necesitemos centrarnos sobre algún elemento, y aplicar algún filtro (por ejemplo, sobre algún país).
Por tanto, indicamos aqui que suma SIEMPRE todas las ventas y todas las unidades, omitiendo cualquier filtro aplicado (en la tabla dinámica o en cualquier medida usada)... así tendremos el Precio Medio Ponderado Total

La opción de 'falso' del condicional anterior es simple, el cociente de las medidas Total_Ventas y Total_Unidades:
[Total_Ventas]/[Total_Unidades]
En este caso la interpretación es directa... el cálculo se ajusta al contexto de filtro aplicado en cada instante...

Podemos ver el resultado en nuestra tabla dinámica:
Power Pivot-DAX: Medias Ponderadas Parciales y Totales

Comprobamos en la imagen como para los artículos que incluyen un único cliente: x2, x4 y x8 el dato devuelto corresponde al Promedio Total, de todos y cada una de las ventas... mientras que en el resto el cálculo responde exclusivamente a las Ventas y Unidades de ese artículo en particular...

OJO, por que al aplicar otros filtros (trimestres o países, por ejemplo), el Precio Medio Ponderado Total, se seguirá calculando sobre la TOTALIDAD de los registros.. y no sobre los que correspondan a ese filtro de País o Trimestre.
Por ejemplo, si aplicamos un filtro para el 'Trim.2' y país 'ES' veremos con el cálculo de PMP Total sigue siendo el mismo que anteriormente (0,411887925), mientras que el Total general de la tabla dinámica, muestra el valor ajustado para los filtros aplicados (Trim.2 y ES).
Power Pivot-DAX: Medias Ponderadas Parciales y Totales

No hay comentarios:

Publicar un comentario

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