Anteriormente, en esta serie, vimos Power Query vs Power Pivot – Metadatos y tablas
En la entrada anterior, vimos que Power Query nos brinda la posibilidad de expandir las columnas de una tabla agregando columnas de tablas relacionadas, de forma muy sencilla, sin crear código de ningún tipo.
Modelado dimensional
Si hemos visto algo de modelado dimensional, entenderemos que no es adecuado agregar columnas descriptivas a las tablas de hecho, y eso fue lo que hice en la demo anterior, a la tabla de Ventas, FactInternetSales, que es claramente una tabla de hechos, agregué un par de columnas expandiéndolas desde la dimensión de Clientes, DimCustomer. El caso es que el modelo tabular lo admite y aunque no soy partidaria de tales prácticas en modelos reales, si lo necesitamos, tenemos forma de hacerlo. Y lo podemos necesitar, por ejemplo, para crear un prototipo muy sencillo y rápido, lo que estaría del todo bien.
Hoy prefiero mostrarles un par de casos en los que sería muy conveniente aprovechar esta capacidad de Power Query para denormalizar.
Denormalizar para examinar con jerarquías
La Base de datos Datawarehouse de Microsoft AdventureWorksDW2012 mantiene 3 tablas para la dimensión Productos, la propia tabla Productos, DimProduct, y dos tablas adicionales para Categoría, DimProductCategory, y Subcategoría, DimProductSubcategory. Esta estructura se muestra en la siguiente imagen.
Veamos cómo denormalizamos con cada una de las herramientas
- Denormalizar con Power Query
Con Power Query, nos ahorramos mucho trabajo si traemos directamente a la tabla Productos, el par de columnas descriptivas que necesitamos, de esta forma denormalizamos, nos quitamos relaciones, columnas y tablas innecesarias en la tabla dinámica. Podemos además, crear jerarquías dentro de la tabla Producto, ah y sin escribir ni una sola línea de código M, se escribe «solito» por nosotros.
Entonces, traemos la tabla productos desde el panel Navegador, sólo una, aunque estamos viendo que hay tres.
Desplazamos la barra hasta encontrar la columna DimProductSubcategory, que se corresponde con las subcategorías.
Seleccionamos dos columnas, EnglishProductSubcategoryName, la categoría como tal y DimProductCategory para traer la tabla Categorías que no está directamente relacionada con Productos y por eso no sale de la primera vez.
Repetimos la acción, seleccionando esta vez EnglishProductCategotyName, es decir las categorías.
De esta forma, nos hemos traído las dos columnas y desde ahora van a formar parte de la tabla Productos. ¿Dije traído? No, no traemos nada desde el Editor de consultas, hemos expandido las columnas en la consulta, apenas al salir es que se ejecuta la consulta y se extraen los datos del servidor original.
Como hay un grupo de productos que no tienen asociados Categorías ni Subcategorías, para ver el efecto correcto de la relación podemos filtrar en la vista preliminar.
Si vemos, los Pasos aplicados en la consulta se corresponden directamente con nuestras acciones.
Y como siempre, sólo para curiosos, el código M.
Eliminar pasos
La idea de la serie no es desgranar toda la enorme riqueza de Power Query; pero me detengo en este caso, para que no perdamos de vista, que si dejamos la consulta tal cual, sólo traerá los productos de la categoría bicicletas, ya que hay un paso que así lo define:
#"Filas filtradas" = Table.SelectRows(#"Expandir DimProductCategory", each ([EnglishProductCategoryName] = "Bikes"))
Así es que, mucho cuidado, hacer la comprobación está bien; pero luego hay que deshacer este último paso. Para deshacer o eliminar un paso, basta con pulsar sobre la X.
Cuando deshacemos un paso, se eliminan todos los pasos, desde el paso eliminado hasta el final de todos los que existen, en este caso es sólo uno y además el último; pero nuevamente, cuidado al eliminar un paso intermedio.
De esta forma, estamos en condiciones de importar al modelo de datos, Power Pivot, el conjunto de datos obtenido como resultado de esta consulta Power Query, y luego analizar, por ejemplo desde tabla dinámica, Power View o Power Map, las ventas por productos, empleando para ello, una jerarquía formada por Categoría-Subcategoría-Producto. La tabla producto ya estaba relacionada con los hechos de las ventas.
¿Y si quiero analizar los datos por Países y/o Ciudades de la tabla Geografía, DimGeography, que no está relacionada con los hechos, FactInternetSales?
Tablas no relacionadas directamente con hechos
Para analizar los hechos por columnas de tablas no directamente relacionadas, hacemos el mismo proceso, denormalizamos para dejar estas columnas en la tabla Clientes, DimCustomer que sí está directamente relacionada.
Desde la tabla de hechos FactInternetSales que representa las ventas, nos desplazamos hasta el final y vemos que tras las columnas de la tabla, aparecen las columnas con los nombres de las tablas relacionadas.
Seleccionamos el botón expandir para la columna de la tabla DimCustomer y seleccionamos la columna que a su vez se corresponde con la tabla DimGeography.
Ahora vemos que ya no está DimCustomer como columna y sí que aparece DimGeography, no podemos dejar de entender que expandir puede significar sustituir, según que acción hagamos, y este es un ejemplo.
Ahora estamos en condiciones de seleccionar las columnas de esa tabla, no directamente relacionada con los hechos en el origen de datos, por las que queremos realizar nuestro análisis.
En nuestro caso, hemos querido volver a seleccionar DimCustomer, para poder expandir otras columnas de DimCustomer, además de DimGeography. Esta acción sería innecesaria si desde el inicio seleccionamos todas las columnas y tablas relacionadas. El paso extra lo he provocado, sobre todo para que veamos que expandir no es dejar todo lo que hay y agregar más, hay que tener cuidado.
De esta forma, la tabla que estamos importando FactInternetSales, que se corresponde con las ventas, trae dos columnas descriptivas para países y ciudades.
Estos dos ejemplos ilustran una funcionalidad muy potente en Power Query, que se puede aprovechar en un sin número de escenarios.
- Denormalizar con Power Pivot
Es posible denormalizar con Power Pivot, además es altamente ventajoso. Cuando creamos un modelo analítico, denormalizar nos permite ajustar el modelo a las necesidades del cliente, quitamos enlaces innecesarios, ocultamos tablas innecesarias, podemos crear jerarquías, son todo ventajas.
Con PowerPivot necesitamos aplicar el lenguaje de expresiones DAX, necesitamos entender que la función RELATED() nos permite traer una columna de una tabla relacionada, aunque la relación no sea directa, como en este caso con Categoría.
Una introducción a DAX y algunos temas relacionados los podemos leer en una de la entradas de la serie dedicada a Denormalizar con DAX
Hay otro aspecto muy interesante en el que difieren Power Query y Power Pivot, es la capacidad de utilizar los metadatos y las relaciones entre tablas de los orígenes de datos, lo veremos en la próxima entrada.
No te pierdas el resto de entradas de la serie Power Query vs Power Pivot