Jueves y toca el último post sobre los itearadores y el
último hasta septiembre ya que tengo la mala costumbre de cogerme vacaciones J.
A lo largo de esta entrada hablaré sobre los iteradores, en
concreto de la función RANKX. La función RANKX, según la web de Microsoft,
devuelve la clasificación de un número en una lista de números de cada fila del
argumento table. Y su sintaxis es la
siguiente:
Dónde:
Table: Cualquier expresión
DAX que devuelve una tabla de datos en la que se evalúa la expresión.
Expression: Cualquier expresión
DAX que devuelve un valor escalar único. La expresión se evalúa para cada fila
de table, para generar todos los valores posibles para la clasificación.
Vea la sección Notas para comprender el comportamiento de la función cuando expression
se evalúa como BLANK.
Value: (Opcional) Cualquier
expresión DAX que devuelva un único valor escalar cuya clasificación se quiere
obtener. Vea la sección Notas para conocer el comportamiento de la función
cuando no se encuentra value en la expresión.
Cuando se omite el
valor de value, se usa en su lugar el valor de la expresión de la fila
actual.
Order: (Opcional) Valor que
especifica cómo clasificar value, de inferior a superior o de superior a
inferior:
Ties: Enumeración que define cómo determinar la
clasificación cuando hay asociaciones.
Como podemos ver, la función RANKX se le pueden hasta 5
argumentos, pero sólo 2 de ellos son obligatorios, el resto opcionales.
Bueno, hasta aquí como siempre la parte más tediosa desde mi
punto de vista, que es la parte teórica. Vamos con la práctica que es con la
más se aprende y para ello vamos como siempre a nuestro modelo de Contoso de
Power BI.
Arrastramos a nuestro informe una tabla y como fila
arrastramos el nombre de los almacenes:
Cogemos nuestra medida favorita, que es la suma de las
ventas:
Y la arrastramos a la matriz que tenemos en el informe de
manera que obtengamos las ventas totales por almacen:
Una vez obtenida la matriz de las ventas por almacen, queremos
obtener un ranking que nos devuelva la posición de cada uno de ellos respecto
al volumen de las ventas. ¿Y cómo lo podemos hacer? Con la función RANKX, que
es la estrella del post de hoy. Para ello escribimos lo siguiente:
Como sólo son obligatorios los dos primeros argumentos, de
momento no rellenamos ningún otro y arrastramos la medida a la matriz:
Y vemos que nos devuelve el valor que ocupa cada país en el
ranking, pero os estaréis preguntando, Javi, ¿no te has dado cuenta de que está
devolviendo todo el rato el valor 1?
Y sí, sí me he dado cuenta, y que me devuelva un 1 en todas
no está mal, y ahora os lanzo yo una pregunta, ¿por qué es que me está
devolviendo todo el rato un 1?
La respuesta es simple, y es por el contexto de fila. Si no
lo veis claro os recomiendo que antes de seguir os leáis el post sobre el
contexto de fila que hice, aquí os dejo el link.
¿Y cómo solucionamos o mejor dicho como hacemos para que me
muestre el ranking en función del total de las ventas? Pues modificando el
contexto y para ello usaremos la función ALL para indicarle que coja todos los
países de los almacenes de la siguiente manera:
Y arrastramos la medida a la matriz:
como queremos.
cómo podéis ver, la función RANKX nos ha generado un registro con valor 1 en el
contexto de fila de Total y analíticamente no tiene sentido, por lo que una
buena práctica es ocultar ese valor para evitar ese sin sentido. ¿Y cómo lo
hacemos? Pues por ejemplo con la función HASONEVALUE.
Nota: HASONEVALUE Devuelve TRUE
si el contexto de columnName se ha filtrado a un solo
valor distinto. De lo contrario, es FALSE. Cuya
sintaxis es:
Una vez avanzado la función y sintaxis de la función,
escribimos lo siguiente:
Lo que estamos haciendo con la función condicional IF y
HASONEVALUE es decir que si la columna de StoreName tiene un valor, entonces
nos devuelve TRUE y ejecuta el RANKX, sino tiene valor devuelve BLANK()
(también podríamos haberlo dejado en blanco la opción FALSE.
¿Se os ocurre otra forma de ocultar el valor Total mediante
DAX?... Seguro que sí, es con una de mis funcione favoritas… ¡Exacto! Con
ISINSCOPE, si no tenéis claro cómo usarla, os dejo aquí el post en el que
hablaba de ISINSCOPE.
Y como resultado, hemos llegado al mismo puerto, pero por
distinto camino ya que ISINSCOPE trabaja con jerarquías.
solo los dos primeros. Hay tres argumentos restantes, que son los siguientes:
valor, que puede ser útil cuando se utilizan diferentes expresiones para
evaluar, respectivamente, la tabla de búsqueda y el valor a utilizar para la
clasificación. ¿Y para qué nos puede servir este parámetro? Por ejemplo, cuando
queramos hacer rankings mediante agrupaciones:
- Si tenemos nuestros clientes y queremos hacer un ranking
para saber los grupos de edad que más nos compran. - Si queremos hacer un ranking de ventas agrupado por valores
escalados.
Para poder llevar a cabo la
agrupación, debemos de tener definida la tabla por la que queremos agrupar,
para este ejemplo, he creado la siguiente tabla de agrupaciones:
Y la métrica para agruparla por la
misma es la siguiente:
Y nos devuelve lo siguiente en la
matriz:
Y si vemos las 3 primeras líneas
nos devuelve un 3, que corresponden a la agrupación 3 de la tabla. ¿Y por qué
el valor más alto es 1? Lo vemos en el siguiente punto, pero antes, ¿cómo
ejecuta la sintaxis DAX para que me devuelva la agrupación?
Se crea obteniendo el valor de
AgrupaciónImportes en el contexto de la fila de AgrupacionVentas. Una
vez que se crea la tabla de búsqueda, RANKX
evalúa Total Ventas en
el contexto de evaluación original
El cuarto parámetro es el orden de clasificación de la tabla
de búsqueda. Puede ser ASC o
DESC. El valor predeterminado es DESC, con los valores más altos en la
parte superior, es decir, un valor más alto da como resultado una clasificación
más baja, de ahí que el valor 1 sea el del valor más alto en la tabla anterior.
Si queremos modificarlo, basta con indicarlo en la medida:
Y nos devuelve:
Como podemos ver, el valor de las filas ha variado y las 3
primeras han pasado de estar en la posición 3 del ranking a estar en la
posición 16.
Y el quinto último parámetro define cómo calcular los
valores en caso de empate. Puede ser DENSE
o SKIP (Omitir). Si es DENSE,
los vínculos se eliminan de la tabla de búsqueda; de lo contrario, se
mantienen o lo que es lo mismo: