Cuando se tiene un modelo de datos con más de una Fact Table, pueden presentarse relaciones circulares y “Synthetic Key”. La primera técnica para solucionar esto es unir las Fact Tables en una sola tabla usando la función Concatenate, siempre que compartan la mayoría de las Key.
Cuando no comparten la mayoria de las Keys, entonces es conveniente usar LinkTables.
Si se tiene una Fact Table de Ventas, y otra de Compras, y se desea saber, por ejemplo, las ventas y las compras de un producto específico al seleccionar una fecha, esto no se obtendría con la asociación natural que hace qlikview. Si se ejecutara sólo el PASO 1 del script debajo, se crean las tablas con la asociación natural de qlikview:
El siguiente script muestra la creación de una Link Table, considerando las fechas de las tablas Ventas y Compras.
Para más información sobre Link Table, ver referencias al final.
//PASO 1: ========== CARGA DE DATOS =============================================
Ventas:
LOAD * INLINE [
IdVenta, IdProducto, Venta, FechaVenta
V1, P1, 54, 28/11/2011
V2, P2, 29, 29/11/2011
V3, P2, 73, 30/11/2011
V4, P2, 66, 01/12/2011
V5, P1, 55, 01/01/2012];
Compras:
LOAD * INLINE [
IdCompra, IdProducto, Compra, FechaCompra
C1, P1, 61, 28/11/2011
C2, P1, 29, 29/11/2011
C3, P1, 55, 30/11/2011
C4, P2, 88, 01/12/2011
C5, P2, 84, 15/01/2012];
Productos:
LOAD * INLINE [
IdProducto, Producto_Desc
P1, Silla
P2, Mesa ];
//PASO 2: ====== CREACIÓN DE FACT TABLES CON NUEVA KEY ===============================
// Se renombrar las foreign key existentes en las Facts, que solo irán en la Link Table
Fact_Ventas:
LOAD IdVenta,
IdProducto as temp_idproducto,
Venta,
FechaVenta
Resident Ventas; DROP Table Ventas;
Fact_Compras:
LOAD IdCompra,
IdProducto as temp_idproducto,
Compra,
FechaCompra
Resident Compras; DROP Table Compras;
//PASO 3: ============= CREACION DE LINK TABLE =========================================
//Concatena todas las key y foreign key existentes en las Fact Tables.
//La LinkTable solo tiene campos de las Fact.
//Los Campos de las tablas de dimensiones no se incluyen en la LinkTable
LinkTable:
LOAD
IdVenta,
temp_idproducto as IdProducto,
FechaVenta as Fecha
Resident Fact_Ventas;
Concatenate (LinkTable)
LOAD IdCompra,
temp_idproducto as IdProducto,
FechaCompra as Fecha
Resident Fact_Compras;
DROP Field temp_idproducto;
//PASO 4: //============== CREACION CALENDARIO MAESTRO ==========================
Calendario_tmp:
LOAD
FechaCompra as Fecha
Resident Fact_Compras;
Outer Join
LOAD
FechaCompra as Fecha
Resident Fact_Compras;
Calendario:
LOAD
Fecha,
Year (Fecha) as Año,
Month (Fecha) as Mes,
day(Fecha) as Dia
Resident Calendario_tmp;
DROP Table Calendario_tmp;
Con LinkTable el modelo de datos queda así:
Referencia:
4 comentarios:
Hola, buen día.
Respecto al código del calendario maestro.
Veo que se repite lo que está antes y depués de outer join, ¿está bien o hay error?
Gracias.
Además otra consulta, para modelos más grandes, ¿podrían haber más de un link table?
Tendrás otro ejemplo de link tables pero con tres Facts a mas y varias dimensiones, porque en todos los ejemplos que he visto, siempre lo hacen dos dos fact tables.
Gracias.
Hola
Sobre el script repetido, tienes razón, la lectura de fechas después del outer jonio debe ser de la tabla de ventas, y no de la de compras. Gracias por la observación, tan pronto pueda hago la corrección.
Sobre tener más de una link table, conceptualmente es posible, si son modelos separados y no comparten relación. Si comparten relación tendría mas sentido tener una única link table con todas las relaciones incluidas y así mantener el modelo estrella.
Lamentablemente ahora no tengo un ejemplo con más de dos fact que pueda compartir. Cuando tenga tiempo hago algo y lo subo.
saludos y gracias por la observación
Hola Enmanuel. Sabía que algo andaba mal. Gracias.
Una consulta tendrás algún correo pues necesito hacerte unas preguntas.
enmanuel.s@gmail.com
Publicar un comentario