Está en la página 1de 11

2019

Efectos secundarios al ordenar por columna

Miguel Angel Franco Garcia

14-5-2019
Efectos secundarios en el ordenamiento por ajuste de columna en dax.
La función Ordenar por columna en Power BI causa efectos secundarios que es importante saber al escribir
una fórmula DAX. Este artículo explico estos efectos secundarios y cómo escribir el código DAX correcto para
evitar obtener resultados incorrectos.
La característica Ordenar por columna ordena los valores de una columna usando los valores de otra columna.
Por ejemplo, un desarrollador puede querer mostrar los meses por su nombre, en una secuencia como enero,
febrero y marzo. Para este fin, es necesario aplicar la propiedad Ordenar por columna a la columna Nombre
del mes, lo que indica que la columna Número del mes debe usarse para definir el orden de clasificación de los
nombres del mes. Esto evita una ordenación alfabética de los valores del nombre del mes.

P á g i n a 1 | 10
Esta configuración causa diferentes efectos secundarios dependiendo del cliente utilizado para consultar el
modelo. Por ejemplo, Power BI genera consultas en DAX para completar un informe, mientras que una tabla
dinámica de Excel genera consultas en MDX. Los diferentes idiomas utilizados por las herramientas del cliente
pueden tener un impacto en el resultado de una medida definida en el modelo. La misma medida podría mostrar
resultados diferentes en informes similares creados con diferentes herramientas. Para entender por qué sucede
esto y cómo evitar estos resultados diferentes, es necesario saber cómo funcionan MDX y DAX.

DAX no tiene ningún orden de clasificación implícito para las columnas que no sea el orden de clasificación
natural del tipo de datos subyacente. Por este motivo, una consulta DAX siempre debe especificar el orden de
clasificación en una condición ORDER BY, de manera similar a una consulta en SQL. Debido a que DAX
requiere que una columna utilizada en ORDER BY sea parte del resultado de la consulta, un visual de Power BI
que ordena una columna siempre incluye al menos dos columnas: la columna solicitada en el informe y la
columna utilizada en el Ordenar por columna.

P á g i n a 2 | 10
Por ejemplo, considere el siguiente informe en Power BI.
Aunque el informe solo muestra el nombre del mes, la consulta DAX incluye tanto
el nombre del mes como el número del mes. El resultado está ordenado
correctamente por número de mes.
La presencia de las dos columnas también causa efectos secundarios en el contexto
del filtro. Por ejemplo, considere las siguientes medidas:
ESFILTRADONOMBREMES = ISFILTERED (Calendario [Nombre Mes])

Devolverá VERDADERO o FALSO, según este o no filtrado el nombre del mes.


ESFILTRADONUMMES = ISFILTERED (Calendario [Mes])

Devolverá VERDADERO o FALSO, según este o no filtrado el numero del mes.


Y una última medida:
Calculo % = DIVIDE([TotalVentas];
CALCULATE([TotalVentas];
ALL (Calendario [Nombre Mes])))

Va a dividir la medida [Total Ventas] por las ventas del mes o meses seleccionados, dándonos el porcentaje
que corresponda.

P á g i n a 3 | 10
Creamos una matriz en Power BI, donde llevaremos el nombre del mes, el total de ventas, y, la medida Calculo
%.

P á g i n a 4 | 10
Ahora, con el mismo modelo de datos, pero en Excel, vamos a crear una tabla dinámica, donde llevamos a Filas
el mes, el total a Valores, quedando de la siguiente manera:

La Calculo % no funciona en Power BI ya que siempre devuelve el 100%, mientras que funciona correctamente
en Excel.

P á g i n a 5 | 10
Power BI siempre devuelve VERDADERO cuando se selecciona un nombre de mes

La razón es que DAX incluye ambas columnas en la consulta

P á g i n a 6 | 10
Reglas de oro para las medidas utilizando Ordenar por columna

Para que una medida que manipula una columna con una configuración Ordenar por columna actúe de manera
predecible, es mejor incluir siempre las dos columnas involucradas en la configuración Ordenar por columna
cada vez que se elimine o manipule un filtro.
Por lo tanto, en lugar de escribir una prueba de filtro en una sola columna:
ESFILTRADONOMBREMES = ISFILTERED (Calendario [Nombre Mes])
ESFILTRADONUMMES = ISFILTERED (Calendario [Mes])

Es mejor escribir una sola expresión que incluya las dos columnas, como:
ESFILTRADONUMMES = ISFILTERED (Calendario [Mes]) // ESFILTRADONUMMES = ISFILTERED (Calendario [Mes])

Es mejor escribir un solo filtro que incluya ambas columnas:

P á g i n a 7 | 10
La medida del porcentaje anterior aparece como sigue:
DIVIDE([TotalVentas];
CALCULATE([TotalVentas];
ALL (Calendario [Nombre Mes]; Calendario [Mes])))

El informe de Power BI que utiliza este último indicador muestra el porcentaje


correcto por mes cuando se usa el nombre del mes en las filas de la matriz.
Cuando usamos el filtro ALL:
ALL (Calendario [Mes]; Calendario [Nombre Mes])

Estamos hallando el total de ventas, porque elimina cualquier filtro existente en


ambas columnas, sumando todas las cantidades que haya para cada fila de la
columna Mes, y cada fila de la columna Nombre Mes, quedando de la siguiente
forma:
CALCULATE([TotalVentas]; ALL (Calendario [Mes]; Calendario [Nombre Mes]))

P á g i n a 8 | 10
Como la medida Calculo % hace la división del total ventas de cada mes entre el total ventas de todas las filas
del modelo de datos, conseguido a través de ALL, pues tenemos el porcentaje que corresponde a cada mes,
como muestra la imagen anterior.

P á g i n a 9 | 10
P á g i n a 10 | 10

También podría gustarte