Contenidos
Este artículo es una continuación de la semana pasada. Le recomiendo que vuelva atrás y lea el artículo primero si se lo perdió, pero en resumen, quiero escribir una medida (no una columna calculada) que devolverá la mediana de ventas de productos excluyendo los productos con espacios en blanco (sin ventas). Como mostré la semana pasada, esto es relativamente fácil con una columna calculada. Aquí está otra vez. Recuerde que escribir primero las columnas calculadas es una excelente manera de visualizar el problema que desea resolver. No es una buena manera de resolver la mayoría de los problemas (algunos sí, la mayoría, no).
Datos de muestra: esquema en estrella simplificado de Adventure Works
Estoy usando mi esquema de estrella simple estándar de Adventure Works para este ejemplo.
Este modelo tiene una tabla de productos y una tabla de ventas, pero no hay información almacenada en ningún lugar que me indique las ventas totales de cada producto.
Calcular la mediana con una columna calculada
Calcular la mediana es bastante fácil con una columna calculada. Primero creé una columna calculada en la tabla de productos de Adventure Works como se muestra a continuación, simplemente refiriéndome al [Total Sales] medir en la nueva columna.
Agregué esta columna como una tarjeta a mi informe y configuré la agregación en MEDIANA, esto es lo que obtuve.
Cuando escribí la medida de prueba equivalente usando MEDIANX, esto es lo que obtuve.
Resulta que cuando usa una columna en una tarjeta en Power BI y encuentra el valor medio, el visual automático filtra los ESPACIOS EN BLANCO por usted, lo quiera o no. No pude ver ninguna forma de cambiar este comportamiento.
Cómo solucionar este problema con Measure y DAX Studio
El momento de este artículo fue perfecto dada la reciente integración de DAX Studio con Power BI Desktop a través de la barra de herramientas de herramientas externas. He dado muchos ejemplos de cómo obtener valor de DAX Studio en el pasado, y este es otro artículo similar.
La semana pasada me di cuenta de que tendría que hacer algunas cosas para resolver este problema en una Medidas. tendría que
- Crea una mesa virtual
- Genera la columna de ventas
- Filtra los espacios en blanco
- Luego haz el cálculo.
Al principio, esto puede parecer abrumador, pero si da un paso atrás y da cada paso, un paso a la vez, puede hacerlo. Así es como lo hice.
Abrir DAX Studio
Encendí DAX Studio yendo a la barra de Herramientas externas y lanzándolo desde allí (lea sobre cómo instalar DAX Studio en el artículo de la semana pasada). Una de las diferencias clave entre el uso de DAX Studio y la escritura de medidas DAX es que DAX studio DEBE devolver una tabla y una medida DEBE devolver un único valor escalar. Esta es la razón exacta por la que estoy usando DAX Studio para resolver este problema. Los pasos 1, 2 y 3 anteriores son todos los pasos de la función de tabla. Quiero VER lo que estoy haciendo, ENTONCES volveré y al cálculo final. Tratar de hacerlo conceptualmente (al menos cuando empiezas) es casi imposible. Hágase un favor y active DAX Studio para solucionar el problema.
Escribí mi primera consulta DAX en el panel de la parte superior (1 a continuación) y hice clic en Ejecutar. Los resultados se muestran a continuación (2). Tenga en cuenta que los resultados son una tabla.
Cada consulta de DAX debe comenzar con la declaración EVALUATE cuando se usa DAX Studio. Este no es el caso si está utilizando el botón Nueva tabla en DAX o si está incrustando la consulta DAX dentro de una medida DAX. Si desea obtener más información sobre las consultas DAX, tengo una serie de 4 artículos que comienzan aquí.
Como puede ver en 2 arriba, esta consulta devolvió la tabla completa. Ahora, para este ejercicio, estoy tratando de obtener una tabla que contenga las ventas totales para cada producto que tenga alguna venta. Un principio al escribir consultas como esta es no devolver ningún dato que no necesite. La tabla de productos es una tabla de dimensiones, y eso significa que la columna ProductKey es una clave principal. Puedo obtener el mismo resultado final simplemente usando ProductKey en lugar de toda la tabla Products. Modifiqué la consulta y la volví a ejecutar. Esto es lo que conseguí. Una sola columna que contiene todas las claves de producto.
Agregar una «columna calculada»
En el artículo de la semana pasada, le mostré cómo crear una columna calculada primero para que pudiera ver lo que estaba haciendo y luego pasar a una medida. Cuando escribe consultas DAX, utiliza un enfoque ligeramente diferente. Existe una función especial llamada ADDCOLUMNS que puede agregar una nueva columna a una tabla.
Como puede ver arriba, he envuelto la consulta original (Línea 3) dentro de una función ADDCOLUMNS. La línea 4 especificaba el nombre de la nueva columna y también qué valor se agregaría a la columna. ¿Ve las similitudes entre escribir una columna calculada y la función ADDCOLUMNS?
Filtrar los espacios en blanco
Vea cuánto más fácil es hacer esto cuando puede VER ¿Que esta pasando? Puedo VER todos esos espacios en blanco y sé que tengo que deshacerme de ellos. Aquí es donde DAX como lenguaje de consulta es realmente poderoso. El código anterior de la línea 2 a la 5 devuelve una TABLA. Esta tabla se puede utilizar como primer parámetro de una función de FILTRO, como sigue.
Observe que la función FILTRO anterior toma una tabla como primer parámetro (líneas 3 a 6) y luego el segundo parámetro (línea 7) filtra los ceros. Ceros, espacios en blanco, nulos, todo es lo mismo para DAX. También observe aquí que la línea 7 se refiere a la columna creada en la línea 5. Ahora, si está familiarizado con las mejores prácticas, sabrá que no es una buena práctica referirse a una columna a menos que especifique la tabla, es decir, Tabla[Column]. Pero cuando crea una columna usando ADDCOLUMNS en una consulta DAX, no puede hacer referencia al nombre de la tabla (porque la tabla no tiene nombre). Es por eso que la línea 7 de arriba parece que estoy filtrando en la medida [Sales], pero en realidad es la columna [Sales].
Entonces, ahora la tabla en la ventana de resultados anterior contiene las ventas totales para cada producto que tiene ventas> 0.
Coge el resultado medio
Si ahora trato de envolver la tabla anterior en un MEDIANX, esto es lo que obtengo.
Tenga en cuenta que obtengo errores. ¿Por qué? ¿Recuerdas que dije al principio? DAX Studio DEBE devolver una tabla. MEDIANX devuelve un valor, por lo que no puede usarlo en DAX Studio de esta manera.
¡Tirantes rizados al rescate! {}
Como mencioné la semana pasada, puede usar las llaves para convertir un valor en una tabla. Entonces escribí esto.
Y DAX Studio devolvió una tabla de una sola columna y una sola fila que contiene la respuesta mediana que busco. Todo lo que quedaba por hacer era copiar la fórmula (líneas 2 a 11) y pegarlas en una medida en Power BI. Aquí está la medida final
Product Sales Median = MEDIANX ( FILTER ( ADDCOLUMNS ( ALL ( Products[ProductKey] ), "Sales", [Total Sales] ), [Sales] > 0 ), [Sales] )
Ahora este es mi punto. Intente escribir la fórmula anterior en sus primeros 2 años escribiendo DAX sin usar DAX Studio. No estoy diciendo que no haya superhumanos que puedan hacer esto, estoy seguro de que los hay. Pero hazte un favor. Divida el problema en pedazos y visualice cada paso a lo largo del viaje para que usted también pueda hacerlo.