Filtros virtuales con TREATAS – R Marketing

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

Contenidos

Nivel: intermedio

Conozco la función TREATAS desde hace mucho tiempo. He intentado entender cómo funciona unas cuantas veces, pero nunca pude resolverlo. Creo que parte del problema es que el nombre de la función TREATAS no es muy descriptivo. Para contrastar este punto, la función FILTRO filtra una tabla, la función TODOS devuelve todas las filas en una tabla, la función SUMA suma todos los valores en una columna, pero ¿TREATAS? ¿Qué hace eso? Simplemente no fue tan intuitivo para mí.

Editar: Gracias a Jess por publicar una explicación del nombre de la función en la sección de comentarios. Tu puedes pensar en TRATAR COMO Me gusta esto.

TRATAR esta COMO un filtro para eso. Más sobre esto a continuación.

Qué hace TREATAS

La función TREATAS se puede utilizar para detectar filtros de su visual (contexto de filtro) y luego aplicar estos filtros a una tabla desconectada en su modelo de datos.

  • Toma una tabla de origen (primer parámetro) y aplica los valores de esa tabla a las columnas de una tabla de destino (segundo parámetro y siguientes).
  • Puede usar una función como VALUES como primer parámetro para detectar el contexto de filtro inicial en un objeto visual y, por lo tanto, TREATAS puede propagar el contexto de filtro a la tabla de destino.
  • No es necesario tener una relación física entre la tabla de origen y la tabla de destino. Por lo tanto, significa que TREATAS se puede utilizar como una relación virtual de muchos a muchos.
  • Puede pasar varios filtros (columnas) de la tabla de origen a la tabla de destino. Por lo tanto, TREATAS se puede utilizar para aplicar múltiples relaciones (es decir, en más de una columna) entre tablas.

Modelo de datos

Para este artículo, estoy usando mi base de datos de Adventure Works modificada como punto de partida. Luego cargué una tabla de presupuesto en el modelo de datos que contiene el presupuesto por mes y categoría para 2004 y 2005. No es posible unir la nueva tabla de presupuesto (que se muestra a continuación) directamente a las tablas de búsqueda existentes. ¿Por qué?

  • Hay 2 columnas de la tabla Calendario que deben unirse a la tabla Presupuesto. Solo es posible tener 1 relación activa entre tablas en DAX.
  • El presupuesto se ha creado en el nivel de granularidad de mes y la tabla de calendario está en el nivel de día. Si intento unirme a Budget[Month] al calendario[Month] será una relación de muchos a muchos y eso no está permitido.
  • Lo mismo se aplica al Calendario.[Year]
  • Lo mismo se aplica a los Productos.[Category].

image_thumb-5130497

Sin relaciones, las imágenes no funcionarán

Hay 2 matrices a continuación, ambas tienen calendario[Month Name] en Filas, Producto[Category] en Columnas y un filtro aplicado para 2004. La matriz de la izquierda muestra el [Total Sales] medida y el modelo de datos está filtrando correctamente los datos de ventas reales. La matriz de la derecha no está filtrando correctamente porque no hay relaciones físicas entre las tablas de búsqueda y la tabla Presupuesto.

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

image_thumb-1-9403728

Entra TREATAS

TREATAS toma una tabla como primer parámetro y luego aplica los valores en la (s) columna (s) de esta tabla y los propaga a las columnas en el segundo parámetro y los siguientes. Por lo tanto, la función TREATAS se puede usar para pasar el contexto de filtro en un objeto visual de la (s) tabla (s) fuente, y ellos aplican este contexto de filtro a la tabla de destino. Vea el ejemplo a continuación

image_thumb-2-4829715

El primer parámetro (1 arriba) es VALORES. VALUES devuelve una tabla de una sola columna que respeta el contexto de filtro inicial de un objeto visual. Este contexto de filtro se pasa luego al segundo parámetro (mostrado como 2 arriba). TREATAS luego devuelve una copia filtrada de la tabla de destino que luego se puede usar dentro de un CALCULATE para aplicar los filtros a una medida. Un ejemplo real hará que sea más fácil de entender. TRATAR 1 COMO un filtro para 2.

Uso de TREATAS para propagar filtros

Usando el modelo de datos de Adventure Works de arriba, quiero detectar los filtros provenientes de Product[Category] en el visual y aplique esos filtros a la tabla de Presupuesto sin la necesidad de tener una relación física. Aquí está la fórmula que hará esto (que se muestra a continuación).

image_thumb-3-3491300

Tenga en cuenta que el primer parámetro dentro de TREATAS (línea 4 arriba) es un VALORES sobre la tabla de búsqueda: este es el contexto de filtro inicial que estoy detectando desde el objeto visual. El segundo parámetro es la columna que recibirá este filtro. Esto tiene el efecto de colocar un filtro de los Productos.[Category] mesa en el presupuesto[Category] columna de la tabla Presupuesto aunque no exista una relación física entre las tablas.

Filtrado en varias columnas

Luego puedo repetir el patrón para operar en múltiples columnas de las mismas tablas o tablas diferentes de la siguiente manera.

image_thumb-4-6779483

En cada función de TREATAS anterior, la función VALUES detecta los filtros en la columna de la tabla de búsqueda seleccionada y luego TREATAS aplica este filtro a la tabla de Presupuesto.

Mejoras de rendimiento

Después de escribir la medida anterior, decidí verificar el rendimiento usando DAX Studio. Cubro cómo usar DAX Studio en detalle en este artículo aquí. Lancé DAX Studio y probé el rendimiento de la medida como se muestra a continuación.

image_thumb-5-8860498

Fórmula TREATAS mejorada usando SUMMARIZE

He aprendido mucho de los italianos, especialmente en lo que respecta a las funciones de la mesa y la optimización del rendimiento. Yo leo este artículo de Marco Russo sobre TREATAS y decidí probar el desempeño de mi medida anterior con la sintaxis alternativa que Marco usó usando SUMMARIZE. Cubro el uso de SUMMARIZE en mi serie de consultas DAX que comienza aquí; es fácil de usar cuando sabes cómo funciona.

SUMMARIZE devuelve una tabla de todas las combinaciones únicas de columnas en el contexto de filtro inicial. El truco para usar SUMMARIZE en múltiples tablas de búsqueda es comenzar siempre desde una tabla de datos común. Tome el modelo de datos que se muestra a continuación.

image_thumb-6-5664304

Para crear una tabla SUMMARIZE que contiene filtros de más de 1 tabla de búsqueda, debe usar la tabla Sales como primer parámetro.

=SUMMARIZE(Sales,
        'Calendar'[Year],
        'Calendar'[MonthName],
         Products[Category]
    )

Esta tabla virtual creada por SUMMARIZE se puede usar dentro de la función TREATAS para pasar los filtros de las 3 columnas a la tabla de presupuesto de una vez.

image_thumb-7-2521443

Esta tabla SUMMARIZE es una tabla virtual que contiene 3 columnas y suficientes filas para cubrir todas las combinaciones únicas de Year, MonthName y Category provenientes de las tablas de búsqueda en el contexto de filtro inicial. TREATAS luego aplica los filtros de las 3 columnas de origen a las columnas de la tabla de Presupuesto como se especifica en las líneas 6, 7 y 8 anteriores. Cuando probé esta nueva medida en DAX Studio obtuve un rendimiento mucho mejor.

image_thumb-8-3629666

Después de volver a probar varias veces, descubrí que la versión SUMMARIZE era consistentemente 3 veces más rápida que la primera versión con múltiples funciones de TREATAS. Realmente no puede confiar en el momento en que las consultas se ejecutan tan rápido como esto, pero probé el rendimiento varias veces y obtuve un resultado bastante consistente.

Una palabra final

La función TREATAS es relativamente nueva y no está disponible en algunas de las versiones anteriores de Power Pivot. No está disponible en Excel 2010/2013/2016 pero está disponible en Power BI Desktop. Si está utilizando Excel, puede utilizar INTERSECT en lugar de TREATAS. INTERSECT efectivamente hace lo mismo. Sin embargo, debe tener en cuenta que la sintaxis está al revés. El primer parámetro es la tabla que recibe el filtro y el segundo parámetro es el filtro que se va a aplicar.

!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ú.