¡Jueves de post! Quién no ha escuchado alguna vez: Los totales en la matriz no están bien ya que no suman el total de la columna…

Yo el primero que lo he escuchado, y sé a ciencia cierta de que no será la última vez que lo vaya a oír. Con este post, espero poder llegar a explicar el motivo del por qué Power BI calcula BIEN el total de las matrices.

Para ello vamos a utilizar el maravilloso modelo de Contoso, como el que muestro en la siguiente imagen:

 

 
 

Donde podemos ver que tenemos dos tablas de dimensiones (DimProduct y DimDate) y una tabla de hechos (FactSales).

En el lienzo, arrastro a una matriz el nombre de los productos de la siguiente manera:

 
 

Ahora vamos a generar la métrica que me sume la cantidad total vendida de todos los productos y la arrastro a la visual:

Cant. Prod. Vendidos = SUM(FactSales[SalesQuantity])

 

 
 

Y vemos que nos muestra por cada producto obtenemos el total de cantidad vendida. Si sumamos todas las cantidades de los productos vemos que el total cuadra con la suma de cada categoría (lo he comprobado con calculadora J ).

¿Qué es lo que está haciendo Power BI? Está realizando la evaluando la métrica en el contexto de fila, o lo que es lo mismo, está filtrando de manera automática y sumando las cantidades vendidas. Si esta métrica la colocamos en una tarjeta, ¿qué obtendremos? ¿La media de las cantidades vendidas de los productos? La respuesta es no, la respuesta correcta es el total de las cantidades vendidas de todos los productos tal y como se puede ver:

 

 
 

¿Y por qué el total? Porque en la tarjeta no tenemos ningún contexto porque filtrar al igual que en el total de la matriz (otra cosa sería que lo forzásemos pero no es el ámbito de este post). En otras palabras, no tenemos un “Contoso Reproductor…XXX” en la tarjeta de ahí que nos muestre el mismo resultado que el total de la matriz.

Seguimos, ahora voy a crear una medida similar a modo explicativo ya que quizás no tiene sentido práctico... Le voy a sumar 1 tal que así:

Cant. Prod. Vendidos + 1 = SUM(FactSales[SalesQuantity]) + 1

 

Y la arrastro a la misma matriz y podemos ver que los parciales nos devuelve el resultado correcto, pero el total de la matriz NO nos devuelve el valor 191744 que es lo que suman todas las cantidades de productos vendidos. En cambio, nos está devolviendo 191734.

 
 
 

La respuesta claramente es que Power BI sí sabe hacer dos sumas en la misma matriz y es lo que está haciendo. Para los resultados de fila, se está evaluando la medida de suma de cantidad vendida en el contexto de fila y una vez realizada, se le está agregando 1, de ahí que por ejemplo para el producto “Contoso Reproductor MP3 de 1 G E100 Blanco” nos esté devolviendo 19999 que es el resultado de 19998 + 1. ¿Se ve?

¿Y para el total que está haciendo? Pues exactamente lo mismo que para las categorías, pero como no existe un contexto, está sumando todas las cantidades vendidas de los productos y posteriormente le está sumando 1, es decir: 191733 + 1 = 191734

Exactamente de la misma manera que si colocásemos el resultado en una tarjeta:

 

 
 

Ahora es cuando nos dicen: “El total está mal. O te has equivocado la hora de sumar o Power BI no sabe sumar…”

Pero realmente Power BI no lo está haciendo mal, está haciendo lo que le hemos dicho... ¿No? ¿Y cómo podemos hacer para que el Total de la matriz sea la suma de los valores de la columna? Para poder solventar y que nos ejecute la suma de cada fila, usamos el iterador SUMX con el que iteraremos la tabla DimProduct y para cada fila de la dimensión, nos va a ejecutar la suma de la cantidad vendida más 1. ¿Y qué pasa cuando llegamos al total? Pues que se eliminan los filtros de la tabla DimProduct y la medida sumará los resultados individuales de cada fila dándonos el resultado correcto. Creamos la siguiente medida para ello:

Cant. Prod. Vendidos + 1 OK =

SUMX(DimProduct,

    [Cant. Prod. Vendidos + 1]

)

 

Y la arrastramos a la matriz y podemos ver el total ahora mismo es la suma de los valores de la columna. Si queréis podéis sumarlo con calculadora J:

 


Hasta aquí, todo solucionado. Ahora bien, ¿qué ocurre si introducimos un nivel de jerarquía en la matriz que provenga de otra dimensión? Me explico, seguimos con el mismo modelo, pero le agregamos una nueva dimensión, la dimensión DimPromotion:

 


 

Queremos saber de la cantidad de productos vendidos, a qué promoción corresponden esas ventas, para ello arrastramos a la matriz el nombre de la promoción:

 


 

Si desplegamos la jerarquía para ver las cantidades vendidas por cada promoción:

 


 

Podemos ver que para Contoso Reproductor MP3 de 1 G E100 Blanco hay ventas de 3 promociones distintas con un valor de 54 + 1, 13 + 1 y 8 + 1 y suman en total 78 frente a los 76 que muestra el total de la matriz. ¿La métrica que hemos creado antes es errónea que ahora ya no funciona? Cuando usamos atributos de diferentes dimensiones debemos introducir en el iterador la función SUMMARIZE de manera que nos permita crear una tabla virtual de la misma forma que la matriz del lienzo. Vamos a por ella:

Cant. Prod. Vendidos + 1 OK v1 =

SUMX(

    SUMMARIZE(FactSales,DimProduct[ProductName],DimPromotion[PromotionName]),[Cant. Prod. Vendidos + 1]

)

Obteniendo en la matriz el resultado de la suma de las filas de la columna:

 

 
 

Y con esta simple función, hemos conseguido hacer que Power BI muestre los totales agregados de la columna. Además hemos entendiendo el motivo de por qué en un principio DAX no lo hacía. Esta explicación, puedes usarla para explicarle a la persona que te diga que los totales están mal en la matriz. ¿No lo crees? Os dejo el video con la demo:




¡Nos vemos en los datos!