Una de las limitaciones que tenia powerpivot 1.0 era que sólamente podíamos establecer una única relación entre un par de tablas. Ahora con la nueva versión de PowerPivot Version CTP 3 ya es posible :). En este post veremos como establecer estas relaciones y un ejemplo práctico de como decidir que relación utilizar mediante DAX.

Para los ejemplos del post trabajaremos con:

  • AdventureWorksDW (DataWhareHouse)
  • PowerPivot 1.0
  • PowerPivot CTP3

Con PowerPivot 1.0

Vamos a ver como teníamos limitadas el número de relaciones en la versión anterior del producto. Para ello lo primero que vamos a hacer es importar datos de AdventureWorksDW:

Importaremos la tabla FactInternetSales y todas las relacionadas.

Al final las tablas que se importan son:

  • DimCurrency
  • DimCustomer
  • DimProduct
  • DimPromotion
  • DimTime
  • DimSalesTerritory

Ahora vamos a ver las relaciones existentes que vienen ya al importar las tablas, para ello en al ventana de PowerPivot seleccionamos en el ribbon o cinta la opción de “Design” y pinchamos en “Manage RelationShips” como se muestra a continuación:

A continuación nos aparecen las relaciones existentes:

Como podemos observar en la imagen anterior existen 6 relaciones, dichas relaciones se crean debido a que en el diseño relacional del origen de datos de donde importamos existen claves ajenas que las relacionan.

Ahora vamos a intentar añadir una relación nosotros manualmente desde PowerPivot. Para ello vamos a realizar los mismos pasos que hemos hecho para ver las relaciones pero esta vez pincharemos en el boton de “Create RelationShip”.

Lo que se pretende hacer es crear una relación nueva entre el campo DateKey de la tabla DimTime y el campo ShipDateKey de la tabla FactInternetSales.

El mensaje que obtenemos es bastante claro: No se pueden crear más relaciones con la tabla de origen seleccionada.

Esto es así debido a que PowerPivot detecta que la tabla FactInternetSales ya ha llegado al número máximo de relaciones, que es una relacion por tabla. Si hubiese una tabla que no tuviese relación, PowerPivot solamente nos dejaria crear una relación con dicha tabla, cumpliendo asi la regla de que solo puede existir una única relacion entre un par de tablas.

Con PowerPivot CTP3

En esta versión ya somos capaces de definir múltiples relaciones entre tablas. Y vamos a ir directo al grano. Basándonos en el ejemplo anterior, vamos a intentar crear 2 relaciones mas entre el campo “DateKey” de la tabla DimTime con los campos DueDateKey y ShipDateKey de la tabla FactInternetSales.

Para crear estas relaciones tenemos dos métodos:

  • Formulario “Create RelationShip” visto en el ejemplo anterior:

Para crear las relaciones a través del formulario basta con rellenar los campos indicando las columnas y las tablas que se van a relacionar.

  • A través de la vista de diagrama:

Para establecer las relaciones con la vista de diagrama basta con pinchar en el campo de una de las tablas que queremso relacionar y arrastrar al campo de la segunda tabla.

A continuación vemos como quedaría las relaciones (tanto en formulario de “Manage Relationships” como en vista de diagrama):

Formulario:

Vista de diagrama:

Si nos fijamos en la vista de diagrama vemos que hay 2 relaciones en linea discontínua. Estas se corresponden con las relaciones que hemos añadido y que vemos en el formulario que no estan activas, o lo que es lo mismo, que no son las relaciones primarias o principales.

Nota: Solo puede haber una relacion activa entre dos tablas

¿Que quiere decir que no son las relaciones principales?

En este momento las relaciones existentes entre las tablas FactInterenetSales y DimTime son:

  • OrderDateKey – TimeKey (primaria)
  • DueDateKey – TimeKey
  • SHipDateKey – TimeKey

Si construimos una Pivot table como la que se muestra a continuación:

Vemos que estamos calculando la cantidad de venta por año. Para ello se esta utilizando la relación primaria entre las tablas FactInternetSales y DimTime. Si cambiamos la relación activa por alguna de las secundarias los resultados obtenidos serán diferentes no es lo mismo analizar las ventas por el año de pedido (OrderDateKey) que por el año de envio (ShipDateKey).

Si cambiamos la relación activa como sigue:

Refrescamos la Pivot Table y vemos que los resultados cambian:

Aunque el total es el mismo, las ventas por año difieren. Para llegar a esto hemos modificado a mano la relación primária, pero ¿que pasa si queremos realizar una comparativa de ambas?. Para esto entra DAX, mediante código DAX podemos decidir que relación utilizar para el cálculo. Para ello hacemos lo siguiente:

1. Creamos una nueva medida que llamaremos SalesAmount (Shipped Date)

2. La formula que pondremos es la siguiente:

=CALCULATE([Sum of SalesAmount],
USERELATIONSHIP(DimTime[TimeKey], FactInternetSales[ShipDateKey]))

Al final la medida debe quedar como muestra la imagen:

y en la Pivot table ya podemos realizar la comparativa tal y como se ve en la siguiente imagen:

Conclusión

Como hemos visto a lo largo de este post y de los anteriores de la serie novedades en denali, muchas son las nuevas características y las mejoras incluidas en el producto. Esta nos da mayor flexibilidad para manejar las relaciones y poder analizar el mismo dato por diferentes aspectos, en este caso analizamos las ventas por año en cuanto a las fechas de pedido y a su vez las comparamos con las ventas en cuanto a la fecha en que se mandaron para entrega.

Espero que os haya gustado y hayamos aprendido algo nuevo.

Hasta la próxima entrega :)!