Varias relaciones entre tablas en DAX

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

Contenidos

Nivel: principiantes

Ayudé a un par de personas esta semana con el tema de la creación de múltiples relaciones entre dos tablas. No hay mucha información sobre este tema en la web, por lo tanto pensé en escribir sobre él aquí.

Power Pivot no es lo mismo que una base de datos relacional

Para aquellos de ustedes que han usado SQL Server o MS Access, sabrán que al utilizar estos programas de bases de datos relacionales, es estupendamente aceptable crear múltiples relaciones entre tablas. Power Pivot no es una base de datos relacional sino una base de datos de informes. Necesita datos estructurados de cierta manera para aprovechar al máximo el rápido procedimiento de búsqueda de los datos necesarios. y mostrarlo en sus informes. Microsoft tuvo que hacer concesiones en el diseño para acelerar este procedimiento, y una de las concesiones es que solo puede haber 1 vinculación activa entre 2 tablas. Al mismo tiempo, la vinculación DEBE ser uno a muchos – sin excepciones (aún cuando esto está cambiando en la edición de Excel 2016: y ya ha cambiado en Power BI Desktop como lo menciona Kevin en los comentarios). Puede leer más sobre las relaciones de 1 a muchas y la forma de los datos en este post de mi base de conocimientos.

¿Por qué necesitarías relaciones múltiples?

El escenario más común con el que me he encontrado es cuando tienes dos columnas de fecha en tu tabla de datos (a modo de ejemplo, Fecha de pedido y Fecha de envío) y desea unir ambas columnas a la Calendario mesa. Si solo hubiera una columna de fecha, regularmente configuraría sus datos de esta manera (que se muestra a continuación). Tenga en cuenta que la vinculación es entre Calendario[Date] y Ventas[Order Date]

imagen

La tentación inmediata es entonces crear una segunda vinculación entre Ventas[Ship Date] y Calendario[Date]. Cuando haga esto, obtendrá el siguiente comportamiento como se muestra a continuación.

imagen

Tenga en cuenta que ahora hay 2 relaciones, pero uno de ellos (el segundo agregado) es una línea discontinua. Si pasa el mouse sobre esta nueva vinculación con la línea discontinua y después hace clic con el botón derecho, verá un menú emergente como se muestra a continuación.

imagen

Observe que una de las alternativas del menú (# 1 arriba) es «Marcar como activo». Esta es una pista de que la vinculación con la línea discontinua está en este momento «inactiva». Cuando pasa el mouse sobre la otra vinculación con una línea sólida y hace clic con el botón derecho, el menú (n. ° 1 a continuación) ahora muestra la opción «Marcar como inactivo», lo que indica que esta está en este momento. activo.

imagen

Esta es verdaderamente la única información que verá en Power Pivot que se refiere a relaciones activas e inactivas. Si cambia el inactivo vinculación y hazla activo, entonces la vinculación activa cambiará automáticamente a inactivo.

Libro de Power BI DAX

Cómo usar relaciones inactivas

Para esta publicación de blog, mantendré la vinculación entre Ventas[Order Date] y Calendario[Date] como la vinculación activa y dejar la otra vinculación como inactiva. Después configuro la próxima tabla dinámica: las etiquetas de fila provienen del Calendario[Date] columna.

imagen

La formula [Count of Orders] es simplemente como sigue

Count of Orders :=
COUNTROWS(Sales)

Por lo tanto ahora el problema es ¿Cómo contar los pedidos que se envían cada día? DAX le posibilita anular la vinculación activa y utiliza la vinculación inactiva en sus fórmulas en su lugar. Para hacer esto, debe utilizar la función DAX USERELATIONSHIP dentro de una función CALCULATE como se muestra a continuación.

Count of Orders Shipped :=
CALCULATE(
    [Count of Orders],
    USERELATIONSHIP(Calendar[Date], Sales[Ship Date])
)

La vinculación DEBE existir en el modelo de datos y establecerse como inactiva para que funcione lo anterior.. No puede simplemente utilizar la función USERELATIONSHIP y especificar dos columnas y esperar que funcione; primero debe configurar la vinculación inactiva.

La tabla dinámica ahora se verá así, mostrando para cada fecha, cuántos pedidos se tomaron y cuántos pedidos se enviaron.

imagen

Alternativamente, puede cargar dos tablas de calendario

Otro enfoque a este problema sería simplemente cargar una segunda tabla de calendario y llamarla ShipCalendar (o semejante). Esto significaría que tiene 2 tablas de calendario y puede utilizar la que necesita para el problema en cuestión. El enfoque que uses depende verdaderamente de preferencia personal y además cómo planea informar sobre sus datos. En la tabla dinámica anterior, puede ver que es fácil ver cualquier fecha y ver cuántos pedidos llegaron y cuántos pedidos se enviaron. A pesar de esto, los pedidos contados en estas dos columnas no son los mismos pedidos (los pedidos que lleguen en cualquier fecha se enviarán al día siguiente o 2 días después en estos datos de prueba).

Si desea poder filtrar los pedidos que se tomaron en una fecha determinada y después ver cuándo se enviaron, deberá cambiar el diseño de la tabla dinámica como se muestra a continuación.

imagen

La fecha (n. ° 1 arriba) proviene de la tabla de calendario y las fechas en las filas (n. ° 2) provienen de la Ventas[Shipped Date] columna. Entonces, esta tabla dinámica le posibilita elegir una «Fecha de pedido» y ver que hubo 9 pedidos, 4 enviados al día siguiente y 5 enviados al día siguiente. El único problema con este enfoque es que la fecha de envío proviene de la tabla de ventas. Claramente está funcionando, pero no es la mejor práctica. Es mucho mejor (especialmente en modelos de datos grandes) utilice siempre una tabla de búsqueda para filtrar su tabla dinámica (el filtro de Filas en esta circunstancia). Por lo tanto una mejor práctica es traer un segundo ShipCalendar y quitar Ventas[Date] en Filas en la tabla dinámica y reemplácelo con ShipCalendar[Date]. (Nota: ahora he eliminado la vinculación inactiva, por lo que las fórmulas DAX anteriores ya no funcionarán).

El resultado con esta nueva tabla de búsqueda agregada será el mismo que con el uso de Ventas[Date] columna en la tabla dinámica, pero este segundo enfoque con una segunda tabla de búsqueda será mucho más eficiente y estará optimizado para Power Pivot (lo cual es esencial cuando tiene muchos datos o Excel de 32 bits).

imagen

Puede descargar mi workbook de muestra aquí si lo desea.

Una palabra final

En resumen, tiene la opción de crear múltiples relaciones entre dos tablas o, alternativamente, puede traer una segunda copia de su tabla de búsqueda.

Si opta por múltiples relaciones:

  • Solo una de las relaciones estará activa
  • Se puede entrar a las otras relaciones a través de la función USERELATIONSHIP dentro de CALCULATE
  • Existe una limitación con este enfoque debido a que solo puede utilizar una columna de su tabla de búsqueda una vez en sus tablas dinámicas. En el ejemplo anterior, esto significaba que no podía utilizar el Calendario[Date] columna dos veces en una tabla dinámica.

Si opta por varias tablas de búsqueda:

  • Tendrá 2 conjuntos de columnas que PUEDEN usarse juntas en una tabla dinámica.
  • Deberá tener cuidado de que los usuarios no se confundan y debería considerar nombrar las columnas en las tablas de búsqueda con nombres únicos como Calendario[Order Date] y ShipCalendar[Ship Date] para mayor claridad.

Suscribite a nuestro Newsletter

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