You are on page 1of 36

1

Prctica 01
Objetivo
Crear un datawareohouse
Pasos para crear cubos OLTP en SQL Server - Inteligencia de Negocios
Pasos para extraer informacin del cubo OLAP en Analysis Services y SQL Server
Business Intelligence Development Studio
La demostracin de transformacin de una Base de datos Transaccional a un Cubo para
anlisis OLAP (un tema de Inteligencia de negocios).
El proceso consiste en ubicar la tabla Fact o tabla que incluya todos los requerimientos,
a continuacin se debe modificar las relaciones de la base de datos y finalmente, cargar
los datos en la nueva relacin o Cubo OLTP. Para la demostracin es
necesario descargar la base de datos de ejemplo desde aqu y tener instalado SQL
Server 2008 estndar.
Esta demostracin es solo un procedimiento de ejemplo, para casos reales se necesita
mayor complejidad de operacin y criterio.
Paso 1:
Descargar la base de datos de ejemplo y restaurar en SQL Server. Tambin
puede restaurar la base de datos desde el script. Observe el esquema de la base de datos
transaccional. Aprecie las relaciones de la base de datos de nombre OLTP_Ventas.

Note que la tabla candidato a FACT es Matrcula porque relaciona las dimensiones
Cliente, Producto, Empleado, etc.




2

Paso 2:
Empieza la construccin de la estructura del cubo.
Borre las relaciones de las tablas para evitar estorbos en las operaciones.



Paso 3:
Seleccionar las tablas que harn la composicin del cubo. En el desarrollo del ejemplo
seleccionaremos Pedido, Cliente, Producto, Empleado y Proveedor
Renombre la tabla Pedido como Fact_Pedido y para el resto de tablas usar Dim_Cliente,
Dim_Producto, etc.
Tener presente que los prefijos 'Fact' y 'Dim' representan la 'Tabla de hechos' y las
'Dimensiones' del cubo respectivamente.




Paso 4:
Crear la tabla Dimensin Tiempo. La dimensin tiempo es necesaria y fundamental en
la construccin del cubo porque clasifica el resto de dimensiones en funcin del tiempo.

CREATE TABLE [dbo].[Dim_tiempo](
[idTiempo] [smalldatetime] NOT NULL,
[dia] [int] NULL,
[mes] [int] NULL,
3

[anio] [int] NULL,
CONSTRAINT [PK_Dim_tiempo] PRIMARY KEY CLUSTERED
(
[idTiempo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Paso 5:
Aadir las "Claves Primarias" en la tabla Fact_Pedido a fin de unir las entidades
Cliente, Producto, Empleado y Proveedor en la tabla Fact_Pedido.
Para la demostracin agregue los campos:

IdProducto
IdProveedor

No olvidar agregar los campos de Mtrica, para la demostracin agregue:

Cantidad (int),
Descuento (int),
Subtotal (Money)

Cambiar el nombre del campo Fact_Pedido.Fecha_pedido por Fact_Pedido.IdTiempo
Finalmente, eliminar el campo Fact_Pedido.Fecha_entrega porque es un campo no
necesario para esta demostracin.

Ahora tenemos la estructura de cubo parcialmente terminada.

Paso 6:

Contina la carga de datos.

Como es evidente, los nuevos campos IdProducto, IdProveedor, Cantidad y Subtotal
recientemente agregados a la tabla Fact_Pedido son iguales a NULL. Por tanto, debe
hacer el ajuste para completar estos valores.
Note que Subtotal es un caso especial, porque es producto del clculo de Cantidad *
Precio.

Un mtodo prctico para llenar la tabla es usar una consulta SQL que completen los
datos que faltan en la tabla Fact_Pedido.

En la demostracin usaremos la siguiente consulta:

SELECT dbo.Fact_Pedido.NroPed, dbo.Dim_Producto.IdProducto,
dbo.Dim_Producto.IdProveedor, dbo.Fact_Pedido.idTiempo,
dbo.Fact_Pedido.Id_Cliente,
dbo.Fact_Pedido.IdEmpleado, dbo.Dim_Detalle_pedido.Cantidad,
dbo.Dim_Detalle_pedido.Descuento,
dbo.Dim_Detalle_pedido.Cantidad * dbo.Dim_Producto.PrecioUnit AS
4

Subtotal
FROM dbo.Fact_Pedido INNER JOIN
dbo.Dim_Detalle_pedido ON dbo.Fact_Pedido.NroPed =
dbo.Dim_Detalle_pedido.NroPedido INNER JOIN
dbo.Dim_Producto ON dbo.Dim_Detalle_pedido.IdProducto =
dbo.Dim_Producto.IdProducto




cuyo resultado es copiado en un archivo de texto:

1 3425 C002 2007-01-25 00:00:00.000 D004 D06 100 15 20,0000
2 4564 C001 2007-05-13 00:00:00.000 F006 C05 15 11 225,0000
3 2345 C001 2007-08-24 00:00:00.000 C003 A02 45 19 202,5000
3 7845 C003 2007-08-24 00:00:00.000 C003 A02 60 15 180,0000

Paso 7:
A continuacin, borrar los registros de la tabla Fact_Pedido. Luego, editar la Tabla
Fact_Pedido quitando la Clave Primaria de NroPed y asignando clave primaria a los
campos:

IdProducto
IdProveedor
idTiempo
Id_Cliente
IdEmpleado

En algunos casos y debido a la duplicacin de registros este paso es opcional.
Una manera sencilla de lograrlo es seleccionar los campos descritos, hacer clic derecho
y asignar "Establecer clave principal". La tabla debera quedar as:

5





Paso 8:
Cargar los datos desde el archivo de texto descrito en Paso 6 sobre la tabla Fact_Pedido.
La tabla se llenar, ya no hay lugar a campos nulos.



Paso 9:
Cargar los datos para la tabla Dim_Tiempo. Los datos de Dim_Tiempo son el resultado
de Fact_Pedido.IdTiempo, por tanto, ser til seleccionar todos
los registros distintos de la tabla Fact_tiempo de la siguiente manera:

SELECT DISTINCT idTiempo, DAY(idTiempo) AS dia, MONTH(idTiempo) AS mes,
YEAR(idTiempo) AS anio
FROM dbo.Fact_Pedido





6


Paso 10:
Relacionar Fact_Pedido con el resto de tablas o dimensiones. Si tiene problemas con los
tipos de datos, cambie los campos de la tabla Fact_Pedido a los tipos requeridos.




Como era de esperarse, ahora tenemos el 'cubo' listo.

7

Otro ejemplo.
Creando una Dimensin de tiempo en SQL Server Analysis Services
Si queremos comenzar a crear un cubo para anlisis de datos en SQL Server Analysis
Services (SSAS) versiones 2005, 2008 y 2008 R2, en lo primero que debemos pensar es
en la dimensin de tiempo. Y es que no tiene sentido crear un cubo para analizar
nuestras ventas, inventario, datos de salud, o cualquier otro hecho, sin tener la
perspectiva del tiempo que le d sentido a dichos datos.
Una dimensin de tiempo define adems la granularidad en que nuestros datos en las
tablas de hechos han sido generados, ya sea a nivel de ao, semestre, trimestre, mes, da,
hora, minuto, segundo, por nombrar algunas escalas. Si bien es cierto que a pesar de que
nuestros datos en las tablas de hechos estn guardados a un nivel granular de tiempo en
especfico, por decir ventas a nivel de mes, ventas a nivel de da, etc.; es una buena
prctica crear una dimensin de tiempo que incluya todos los niveles de granularidad
que podran usarse no slo en las tablas de hechos (fact tables) que se vayan a crear
ahora requieran, sino tambin las que se puedan tener a lo largo de la vida de nuestra
solucin. Por tanto es recomendable por lo menos crear una dimensin de tiempo con
los niveles: ao>semestre>trimestre>mes>da.
En otro caso, si la industria en la que estn trabajando lo requiere, se podran considerar
otros niveles de tiempo menores a da, como hora>minuto>segundo, pero la estrategia
de implementacin de ese nivel de granularidad puede ser muy distinta a la que vamos a
ver hoy en este artculo para el caso de da como mnimo nivel granular.
Una de las facilidades que nos brinda SSAS con respecto a la dimensin de tiempo, es
que l mismo la genere por nosotros incluso sin tener una tabla fsica de tiempo pre-
existente en nuestro data warehouse. Este es el escenario que vamos a explorar en esta
oportunidad, hablaremos de las otras opciones que tiene SSAS ms adelante.
El propsito de este artculo es entender cmo SSAS nos facilita la vida en trminos de
generar nuestra propia dimensin de tiempo, que luego adems podremos personalizar a
nuestro gusto. El segundo propsito es que podamos aprender cmo SSAS hace el
trabajo y entender su funcionamiento, de modo que nosotros podamos crear nuestra
propia dimensin de tiempo desde cero si algo no nos gusta. Comencemos!
1. Creando el Data Warehouse
Vamos a crear una nueva base de datos con nombre MiDataWarehouse en SQL Server
2008 R2, la cual ser nuestro DataWarehouse ficticio sin tabla u otro objeto alguno:
8


2. Creando el proyecto de Analysis Services
Ahora crearemos un nuevo proyecto de SSAS en el Business Intelligence Development
Studio (BIDS) de la versin de SQL Server 2008R2:

4. Creando el Data Source
Creamos un nuevo Data Source que apunte hacia nuestra base de datos
MiDataWarehouse:
9



10



11



5. Creando el Data Source View
Ahora procedemos a crear nuestro Data Source View, en donde posteriormente SSAS
generar la definicin de nuestra dimensin de tiempo de manera automtica:
12



13


Como mencion anteriormente, no tenemos tabla alguna en nuestra base de datos, as
que no tenemos nada que agregar al Data Source View:

14


6. Creando la dimensin de tiempo
Ahora procedemos a crear nuestra dimensin de tiempo en SSAS:

15


La pantalla que se muestra a continuacin es clave, ya que nos permite indicar a SSAS,
de qu forma generaremos nuestra nueva dimensin, en este caso la dimensin de
tiempo:

Nos detenemos aqu un momento para explicar las opciones que se muestran:
16

Use an existing table: Se crear una nueva dimensin en nuestra base de datos OLAP
(SSAS) basada en una tabla pre-existente de nuestro Data Source View (y por tanto en
nuestro DW).
Generate a time table in the data source: Se crear una dimensin de tiempo en
nuestro DW, su respectiva definicin en el Data Source View y la dimensin de tiempo
en nuestra base de datos OLAP.
Generate a time table on the server: Se crear la dimensin de tiempo en nuestra base
de datos OLAP similar a la opcin anterior. La posible desventaja de esta opcin es que
no nos crear nada en nuestro Data Source View que podamos modificar si as lo
deseamos. Tampoco necesita de una dimensin existente en nuestro Data Warehouse.
Generate a non-time table in the data source: Se crear una dimensin distinta a una
dimensin de tiempo en nuestro DW, su respectiva definicin en el Data Source View y
la dimensin correspondiente en nuestra base de datos OLAP.
Como se muestra en la imagen anterior, seleccionamos la opcin Generate a time table
in the data source para que SSAS sea el que se encargue de todo el trabajo.
La siguiente pantalla del asistente (Dimension Wizard) nos pide el rango de fechas para
los cuales queremos generar datos en nueva dimensin de tiempo. De igual manera nos
pide seleccionar cul son los periodos de tiempo que queremos generar. En mi caso he
seleccionado todas las opciones pero es muy probable que no todos necesiten la opcin
de Half Year (semestre) o la de Ten Days (diez das) por mencionar alguna de las menos
comunes. Finalmente, esta pantalla nos pide indicar cul ser el idioma en que se deben
generar los datos de nuestra dimensin de tiempo y como se muestra a continuacin, no
incluye el idioma Espaol (lo cual es una deficiencia siendo el Espaol el segundo o
tercer lenguaje ms hablado del mundo).
Una de las formas superar esta deficiencia sera definiendo una traduccin (dimension
translation) para cada atributo. Pueden revisar ms detalles de cmo hacer esto en
Defining and Browsing Translations (http://technet.microsoft.com/en-
us/library/ms166708(SQL.90).aspx). Nosotros seguiremos enfocados en cmo SSAS
genera la dimensin de tiempo (aunque sea en Ingls) y las relaciones entre sus
atributos.
17


La siguiente pantalla del asistente, pregunta por los tipos de calendario que queremos
generar en nuestra dimensin. Los ms usados son Regular calendar (calendario
natural) y Fiscal calendar (calendario fiscal) que son las que seleccionaremos. En el
caso del calendario fiscal, es posible indicar cul ser el da y el mes en que se inicia
dicho calendario de acuerdo a nuestra organizacin, as mismo el nombre del ao fiscal
en comparacin con el nombre del ao calendario:

18

Esta es toda la informacin que SSAS necesita para generar nuestra dimensin de
tiempo en el lado OLAP (SSAS). Ahora en la pantalla final que se muestra a
continuacin seleccionaremos el checkbox que dice Generate schema now para que en
este mismo momento SSAS nos cree tambin la tabla fsica en nuestro Data Warehouse
y su definicin en nuestro Data Source View.

Ahora aparecer un nuevo asistente que nos guiar a travs del proceso de la generacin
del esquema fsico y lgico que soportarn nuestra dimensin de tiempo, as como los
datos (miembros) que contendr:
19


La primera pregunta del asistente es acerca del Data Source View (DSV) en que
deseamos crear la definicin de la nueva dimensin. En nuestro caso seleccionaremos el
mismo DSV que ya hemos creado al inicio de esta solucin y que hasta el momento no
contiene elemento alguno:

Ahora vienen las preguntas con respecto a la creacin fsica de la tabla sobre nuestro
Data Warehouse incluyendo si queremos poblar de datos nuestra nueva tabla:
20


Una pantalla ms antes de terminar y esta se refiere a la convencin de nombres o
estndares a usar en las columnas de la nueva tabla:

Una vez finalizado el asistente, se inicia el proceso de generacin del esquema y de la
tabla fsica, el cual puede ser examinado en detalle en la siguiente pantalla:
21


7. Analizando la estructura de la nueva dimensin de tiempo
Ya tenemos nuestro nuevo esquema y estamos listos para ver la magia detrs del
espectculo, comenzando por la nueva tabla dbo.Time creada en nuestra base de datos
MiDataWareHouse.
Noten que el asistente ha creado columnas para cada uno de los periodos de tiempo
siguiendo las convenciones de nombre seleccionadas:
22


Si hacemos una consulta a la tabla generada, veremos que tambin se han generado los
datos apropiados para cada una de las columnas en el rango de fechas indicado:

Cmo mencionamos anteriormente en este artculo, adems de la tabla fsica en nuestro
DW, se ha creado la definicin de nuestra dimensin y la dimensin en s dentro de
nuestro proyecto de SSAS. Nuestro Data Source View ahora tiene la tabla Time:
23


Los atributos de nuestra flamante y nueva dimensin de tiempo se muestran a
continuacin:
24


El asistente tambin nos ha creado una serie de jerarquas naturales. Estas son:


25





Despus de identificar los componentes bsicos de nuestra dimensin, ya estamos listos
para explorar los resultados de nuestra nueva dimensin de tiempo pero no sin antes
procesar la misma:

26

8. Explorando los datos de la nueva dimensin de tiempo
Finalmente, ya podemos explorar los resultados de nuestra nueva dimensin de tiempo.
Si se posicionan en la pestaa Browser, pueden seleccionar cada uno de los atributos
de la dimensin o una de las jerarquas. En nuestro caso, seleccionamos la jerarqua
Year Trimester Month - Ten Days Date:

Los resultados se muestran como esperbamos, de igual manera para la jerarqua Year
Half Year Quarter Month Ten Days - Date:
27


Tambin tenemos jerarquas para el calendario fiscal como Fiscal Year Fiscal Half
Year Fiscal Quarter Fiscal Month Fiscal Day:
28


9. Factores claves en el diseo de una dimensin de tiempo
De acuerdo a mi experiencia, mucho sucede que cuando construimos una dimensin de
tiempo por nuestros propios medios, la navegacin de las jerarquas creadas no funciona
como nosotros esperamos, con los miembros de datos asignados al padre incorrecto (por
ejemplo una fecha dentro del mes incorrecto, o un trimestre dentro del ao incorrecto).
Debido a esto, debemos tener claro que una de las claves de xito de cualquier
dimensin de SSAS es la definicin de relaciones entre sus atributos. De esto depende
que nuestras jerarquas funcionen correctamente y por otro lado tienen un gran impacto
en los tiempos de respuesta cuando el usuario navegue sobre el cubo al que pertenezca
la dimensin.
La dimensin de tiempo generada ha sido definida con las siguientes relaciones entre
sus atributos:
29


He subrayado en color rojo los atributos de la jerarqua Year Half Year Quarter
Month Ten Days Date, para profundizar un poco en los detalles de sus atributos
Clave Primaria y Columna a Mostrar. La propiedad Clave Primaria (KeyColumns),
define cmo SSAS va a diferenciar internamente a cada uno de los miembros del
atributo, los cuales tienen que ser valores nicos. Debemos usar la propiedad Columna a
Mostrar (Display Column), en el caso de querer mostrar una columna distinta a la usada
en la clave primaria o cuando sta est compuesta de dos o ms columnas. Esto nos
ayudar a evitar posibles errores de navegacin tanto de la dimensin de tiempo como
de cualquier otra dimensin.
En el caso del atributo Year, ste define como su KeyColumn a la columna Year de
nuestra tabla Time; y como NameColumn a la columna Year_Name:

Si exploramos los datos que contienen ests dos columnas vemos lo siguiente:
30


Hago nfasis nuevamente sobre la importancia de la propiedad KeyColumn de un
atributo, el cual debe contener un valor nico para cada miembro de datos incluyendo a
las jerarquas a donde est asignado. En el caso del atributo Year, no se tiene mayores
problemas ya que no es posible confundir un ao con otro, ya que el valor del ao en
s es su identificador nico.
En cambio, con un atributo como Half Year (semestre) deberamos tener un poco ms
de cuidado, ya que si revisan su relacin con el atributo Year en la imagen del
Dimension Usage, esta es de varios-a-uno, es decir, varios (dos) semestres en un ao.
Por tanto, en este contexto un semestre no vive por s solo, sino que le pertenece a un
ao en especfico. Es decir, si nos piden el semestre 1, nos tienen que decir siempre el
ao al que se estn refiriendo. Por ejemplo: semestre 1 del 2010, semestre 2 del 2010,
etc.
Por tanto el KeyColumn para HalfYear debe de identificar nicamente a cada semestre
dentro de un ao. En el caso de nuestra dimensin, las propiedades KeyColumn y
NameColumn estn definidas de la siguiente manera:

31

Los datos que almacenan dichas columnas se muestran a continuacin:

Noten, que la columna Half_Year definida como KeyColumn, tiene sus valores
incluyendo no slo el mes de inicio del semestre (01 enero - 07 - julio), sino tambin
el ao al que pertenece (1950-01-01 y 1950-07-01 para los que se muestran en la
imagen).
MUY IMPORTANTE: Si la columna Half_Year slo tuviera el semestre y no el ao
(por ejemplo: Semestre 1, Semestre 2), habra la necesidad de definir un KeyColumn
compuesto que no slo incluya la columna Half-Year sino tambin la columna Year, ya
que ambas en su combinacin, haran nico a cada miembro de datos.
El comportamiento de Half-Year es similar al de Trimester y Month de nuestra
jerarqua. Es decir, requiere que la columna que se use como KeyColumn, incluya en su
definicin, el ao al que pertenece y no solamente el nombre del periodo. En el caso del
atributo Date, ste se comporta de manera similar a Year, ya que cada fecha por s
misma es auto-suficiente para no ser confundida con otra fecha del calendario.
As se ve el atributo Month (mes) de nuestra dimensin:
32


Ahora veamos sus propiedades:

33


Como vimos, la definicin de Month es idntica a la de Half-Year. Pero ahora veamos
cmo se ven los datos del atributo Month Of Year, el cul no pertenece a ninguna
jerarqua sino como atributo independiente de nuestra dimensin de tiempo:

En este caso Month Of Year slo nos muestra los doce meses del ao sin indicar a qu
ao pertenece. Este tipo de atributo es necesario, para cuando necesitemos crear algn
informe que permita el anlisis comparativo de los mismos meses para distintos aos,
como por ejemplo:
34

Month 1 Month 2 Month 3
2009
2010
2011
Debido a esto las propiedades del atributo Month of Year han sido definidas como
sigue:

Las columnas Month_Of_Year y el Month_Of_Year_Name contienen los siguientes
valores:
35


Como se muestra en la ltima imagen, a diferencia de la columna Month,
Month_Of_Year no contiene el ao como parte de sus valores, solamente el periodo de
tiempo al que pertenece, en este caso el mes. Esto permite que todos los meses de Enero
(Month 1) de cualquier ao o trimestre, aparezca como si fuese uno solo. Lo mismo para
todos los dems meses del ao.
10. El cierre
Como resumir, podemos sealar lo siguiente:
SQL Server Analysis Services, nos puede ahorrar mucho el trabajo de crear una
dimensin de tiempo para nuestra solucin OLAP incluso sin tener previamente la
dimensin creada en nuestro Data Warehouse relacional.
Podemos crear una dimensin de tiempo y su tabla en nuestro Data Warehouse
usando el asistente para la creacin de dimensiones de SSAS, y luego personalizar la
misma para dejarla a nuestro gusto como borrar algn atributo o modificar alguna
jerarqua.
Podemos optar tambin por crear nuestra dimensin de tiempo desde cero (por
ejemplo si la queremos hacer en Espaol) siguiendo las mejores prcticas de acuerdo a
como SSAS crea su dimensin de tiempo.
El asistente para la creacin de la dimensin de SSAS no soporta el idioma Espaol.
Una forma para tener nuestra dimensin de tiempo en este idioma, es crearla por
ejemplo en Ingls y modificarla para usar la capacin de Translations de SSAS.
A diferencia de una base de datos relacional en donde el centro de todo son las
relaciones entre tablas. La definicin de relaciones entre atributos es la parte nuclear
que define el comportamiento e influye en los tiempos de respuesta de nuestro cubo.
Otro aspecto clave para obtener el comportamiento deseado de nuestras jerarquas y
atributos es la definicin de las claves. Debemos indicar en la propiedad KeyColumn, la
columna que haga a nuestro atributo nico de acuerdo al contexto en donde se vaya a
usar, ya sea como parte de una jerarqua o como atributo independiente.
36

Ya con nuestra nueva dimensin de tiempo, estamos listos para agregando las dems
dimensiones a nuestra solucin OLAP y posteriormente el o los cubos que sean
necesarios.

You might also like