Ventas de los mismos productos a otros clientes

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Nivel: Intermedio

Recientemente, estaba ayudando a alguien en un foro y pensé que la pregunta y la solución serían un artículo de blog interesante. He adaptado el escenario para trabajar con las compras de los clientes de Adventure Works, pero este concepto funcionaría igualmente bien en otras entidades, como territorios de ventas, años naturales, etc.

Definición del problema

El requisito es poder seleccionar un solo cliente de una lista de clientes y ver qué productos han comprado. Luego, lo siguiente es poder comparar las ventas de este mismo grupo de productos en todos los clientes sin tener en cuenta las ventas de todos los demás productos. Dicho de otra manera, el informe debe mostrar las ventas de todos los clientes, pero solo de los productos comprados por el cliente seleccionado originalmente. Ahora hay una solución de «trampas» para este problema mediante el uso de filtros de nivel visual; hablaremos de eso más adelante. El propósito de este artículo es mostrar una solución única para DAX.

El primer intento no funciona

Para el primer intento de resolver este problema, escribí un par de medidas …

Total Sales = SUM(Sales[ExtendedAmount])
Total Sales of these Products to Other Customers Doesn't Work 
   = CALCULATE([Total Sales], ALL(Customers))

… Y luego colóquelos en dos tablas diferentes como se muestra a continuación.

Cuando hago clic en una clave de cliente a la izquierda en la tabla de filtros, la tabla de la derecha se filtra de forma cruzada y muestra las ventas totales a ese cliente.

Informe Página 1

image_thumb-25-5936432

Pero surge un problema cuando agrego la segunda medida. Las ventas totales del primer cliente siguen siendo correctas (2 a continuación), pero el otro total (3 a continuación) no está haciendo lo que quiero. Muestra todas las ventas de todos los productos en lugar de las ventas totales de los mismos productos comprados por el cliente, como se muestra a continuación.

Informe Página 2

image_thumb-26-8821341

Entonces, ¿por qué no funciona?

Para comprender por qué esto no funciona, debe pensar en los filtros de tabla. En la página 1 del informe anterior, hay un filtro en el cliente seleccionado (12301) pero no hay un filtro en ningún producto. La tabla de resultados de la izquierda solo muestra las ventas de los productos comprados por ese cliente porque todos los productos que devuelven EN BLANCO (es decir, sin ventas) se ocultan automáticamente en la imagen. No hay ningún filtro en los productos, es solo que los productos sin ventas están ocultos.

En la página 2 del informe anterior, la nueva medida agregada elimina el filtro de la tabla de clientes. Ahora no hay ningún filtro en la tabla de clientes o en la tabla de productos. Como resultado, las ventas totales de todos los clientes y todos los productos se devuelven a la tabla de resultados de la derecha.

Solución de trucos

Ok, hay una solución de trampas (no DAX) para este problema. Todo lo que tiene que hacer es seleccionar el visual de resultados (1 a continuación) y luego ir al panel de filtros a la derecha y establecer un filtro en [Total Sales] para filtrar los espacios en blanco (2 a continuación).

image_thumb-27-7174165

No hay nada de malo en esta solución de trucos para este objeto visual en particular, pero la solución comienza a desmoronarse cuando intentas hacer esto con un objeto visual diferente. Digamos, por ejemplo, que desea ver las ventas totales de categorías de productos como se muestra a continuación. Puede ver a continuación que todavía hay un filtro en [Total Sales] no está en blanco, pero este filtro deja de funcionar como lo necesito porque la clave de producto ya no está en el visual.

image_thumb-28-6020503

Solución única de DAX

El secreto para resolver este problema con una única solución de DAX es «detectar» la lista de claves de producto compradas por el cliente seleccionado y luego pasar esta lista de claves de producto a la segunda medida. Después de usar la medida correcta, este es el resultado que se muestra a continuación. Tenga en cuenta que he agregado algunas otras columnas de valor agregado a la tabla de resultados para mejorar la información.

image_thumb-29-4492468

super-charge-power-bi-ad_1-1024x128-6595595

La fórmula de DAX es la siguiente.

image_thumb-30-5956756

Observe arriba que he usado la sintaxis VAR. Esta sintaxis realmente está empezando a crecer en mí. Creo que hace que las fórmulas sean más fáciles de leer y comprender, ¿no estás de acuerdo? Entonces, lo primero que hago es crear una variable ProductList que es una tabla de una sola columna que contiene todos los productos en el contexto del filtro. La salsa secreta aquí es la magia negra en la línea 3. Este es un tema avanzado por derecho propio y explico cómo funciona en este artículo aquí. En este escenario, la línea 3 mira la tabla Ventas en el contexto del filtro actual (es decir, qué productos tiene este cliente seleccionado comprado) y luego empuja este filtro a la tabla Productos. VALUES luego produce una tabla de una sola columna de solo estos productos comprados por el cliente. Esta nueva tabla virtual creada por VALUES conserva el linaje de la tabla Productos, por lo que cada vez que esta tabla VALUES virtual se usa como filtro en una función, el filtro se propagará como si fuera parte del modelo de datos físicos.

Como puede ver en la imagen a continuación, es posible intercambiar la clave de producto por la categoría de producto con esta solución única de DAX, a diferencia del enfoque del truco anterior.

image_thumb-31-9669233

Utilice VALORES para recuperar los filtros

La solución anterior es en realidad más difícil de lo que debería ser (aunque, como puede ver, funciona y es un gran ejemplo de aprendizaje). Sin embargo, la solución más fácil a este problema es usar la función VALORES para «traer de vuelta» un filtro que de otro modo se hubiera eliminado. Toma la siguiente fórmula.

Test = CALCULATE([Total Sales], ALL(Customers))

La parte TODOS de la fórmula anterior elimina el filtro de la tabla Clientes. Esto es necesario para poder mostrar las ventas de otros clientes, pero simplemente devolverá todas las ventas de todos los clientes. Para resolver el problema, debe recuperar un filtro solo en los productos que compró el cliente seleccionado. ¿Dónde puede obtener esa lista de productos que compró el cliente seleccionado? de la tabla Sales, ahí es donde, usando VALUES (Sales[ProductKey]). Cuando se juntan en la fórmula final, se obtiene lo siguiente

VALUES Solution = 
          CALCULATE(
                    [Total Sales], 
                    ALL(Customers),
                    VALUES(Sales[ProductKey])
                   )

La parte TODOS (Clientes) elimina el filtro del cliente seleccionado, luego los VALORES (Ventas[ProductKey]) vuelve a aplicar un filtro solo a los productos adquiridos por el cliente seleccionado.

Puede descargar una copia del workbook que utilicé para este artículo a continuación.

Mismos productos para otros clientes

!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window,document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘639916389503636’);
fbq(‘track’, ‘PageView’);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.