Developers Group

Sql Server Analysis Services 2008 Diseño Multidimensional Tecnología OLAP Tutorial SSAS

Producto

Tiempo Cliente

C.Roberto Asto Caceres Oracle_croberto_asto@hotmail.com

1.-Uso de Microsoft Analysis Services En este apartado se introduce al lector en el uso de la herramienta de Microsoft que permite hacer análisis multidimensional. Su nombre es Microsoft Analysis Services. A continuación se realizan unas consideraciones que van a ayudar a hacer un buen uso de la herramienta. Un cubo OLAP es una representación multidimensional de los datos detallados (filas concretas) y de los resumidos (agregados). Se utilizan para consultas analíticas complejas que buscan información en la base de datos desde puntos de vista distintos, que quedan establecidos por sus dimensiones. Cada cubo representa una entidad de negocio diferente, como ventas o recursos humanos. Los cubos se crean a partir de un esquema de base de datos en estrella o en copo de nieve. Estos se caracterizan por tener tablas de hechos y tablas de dimensiones. Las tablas de hechos guardan los datos históricos. Estos generalmente son medidas numéricas que describen una transacción del negocio que se trate (ventas, transacciones bancarias) Las tablas de dimensiones se emplean para especificar el significado de los datos contenidos en la tabla de hechos. El esquema en estrella, se caracteriza por tener una tabla de hechos en el centro rodeada de tablas de dimensiones que contienen la descripción de los hechos desmoralizados. El esquema en copo de nieve es una extensión del modelo en estrella en el que una o más dimensiones se definen por varias tablas.

2.- Construcción Base de Datos de Origen Creado la Base de Datos
Use master Go Create Database Cubo_Ventas_OLAP On Primary ( Name = 'Cubo_Ventas_Data', FileName = 'D:\BIData\Cubo_Ventas_Data.MDF', Size = 6Mb, MaxSize = UnLimited, FileGrowth = 1Mb ) Log On ( Name = 'Cubo_Ventas_Log', FileName = 'D:\BIData\Cubo_Ventas_Log.LDF', Size = 3Mb, Maxsize = 20Mb, FileGrowth = 1Mb ) Go

Tablas de Dimensión
Use Cubo_Ventas_OLAP Go

Tablas de Dimensión Tiempo_Dim
Create Table Tiempo_Dim ( TiempoKey Fecha Dia Mes Año Trimestre MesAño DiaSemana DiaAño SemanaAño )

Int Identity(1,1) Not Null DateTime Not Null, nVarchar(20) Not Null, Int Not Null, Int Not Int Not nVarchar(16) Not Null, Int Not Null, Int Not Null, Int Not

Primary Key,

Null, Null,

Null

Tablas de Dimensión Cliente_Dim
Create Table Cliente_Dim ( ClienteKey ClienteID Empresa NombreCliente CargoCliente Direccion Localidad Region CodigoPostal Pais Telefono Fax )

Int Identity(1,1) Not Null Primary Key, nChar(5) Not Null, nVarchar(40) Not Null, nVarchar(30) Not Null, nVarchar(30) Not Null, nVarchar(60) Not Null, nVarchar(15) Not Null, nVarchar(15) Not Null, nVarchar(10) Not Null, nVarchar(15) Not Null, nVarchar(24) Not Null, nVarchar(24) Null

Tablas de Dimensión Empleado_Dim
Create Table Empleado_Dim ( EmpleadoKey EmpleadoID EmpleadoName FechaInicioContrato FechaNacimiento Salario Puesto )

Int Identity(1,1) Not Null Primary Key, Int Not Null, nVarchar(30) Not Null, DateTime Not Null, DateTime Not Null, Money Not Null, nVarchar(30) Not Null

Tablas de Dimensión Producto_Dim
Create Table Producto_Dim ( ProductoKey ProductoID ProductoNombre SuministradorNombre CategoriaNombre MinimoStock UnidadPrecio CantidadPorUnidad )

Int Identity(1,1) Not Null Primary Key, Int Not Null, nVarchar(40) Not Null, nVarchar(40) Not Null, nVarchar(15) Not Null, Money Not Null, Money Not Null, nvarchar(20) Not Null

Tablas de Dimensión Transporte_Dim
Create Table Transporte_Dim ( TransporteKey Int Identity(1,1) TransporteID Int Nombre nvarchar(40) )

Not Null Primary Key, Not Null, Not Null

Tablas de Hechos Ventas_Fact
Create Table Ventas_Fact ( TiempoKey Int ClienteKey Int EmpleadoKey Int ProductoKey Int TransporteKey Int FechaRequeriada DateTime FechaEnvio DateTime UnidadesLinea Money TotalLinea Money CosteFleteLinea Money DescuentoTotalLinea Money BeneficioTotalLinea Money )

Not Not Not Not Not Not Not Not Not Not Not Not

Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null,

Agregando Clave Primaria a las Tablas de Dimensión
Alter Table Ventas_Fact Add Primary Key (TiempoKey, ClienteKey, EmpleadoKey, ProductoKey, TransporteKey) Go

Agregando Clave Secundaria a las Tablas de Dimensión
Use Cubo_Ventas_OLAP Go Alter Table Ventas_Fact Add Foreign Key (TiempoKey) References Tiempo_Dim(TiempoKey) Go Alter Table Ventas_Fact Add Foreign Key (ClienteKey) References Cliente_Dim(ClienteKey) Go Alter Table Ventas_Fact Add Foreign Key (TransporteKey) References Transporte_Dim(TransporteKey) Go Alter Table Ventas_Fact Add Foreign Key (ProductoKey) References Producto_Dim(ProductoKey) Go Alter Table Ventas_Fact Add Foreign Key (EmpleadoKey) References Empleado_Dim(EmpleadoKey) Go

Tabla Cliente_Dim

Recíprocamente las demás Tablas de Dimensión se encuentran vacías, para ello realizamos el mecanismo de migración de datos, a continuación. Construyendo SELECT para Cargar Data (Migración de Datos) Migramos Datos de la Base de Datos Nortwind a la Base de Datos Cubo_Ventas_OLAP

Tabla Northwind.dbo.Customers  Tabla Cubo_Ventas_OLAP.dbo.Cliente_Dim
INSERT INTO Cubo_Ventas_OLAP.dbo.Cliente_Dim SELECT CustomerID,CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Northwind.dbo.Customers GO SELECT * FROM Cubo_Ventas_OLAP.dbo.Cliente_Dim GO

Tabla Northwind.dbo.Employees  Tabla Cubo_Ventas_OLAP.dbo.Empleado_Dim
SELECT * FROM Northwind.dbo.Employees INSERT INTO Cubo_Ventas_OLAP.dbo.Empleado_Dim SELECT EmployeeID, LastName + ' , ' + FirstName as Nombres, HireDate,BirthDate,Extension *100,Title FROM Northwind.dbo.Employees GO SELECT * FROM Cubo_Ventas_OLAP.dbo.Empleado_Dim GO Tabla Northwind.dbo.Categories  Tabla Cubo_Ventas_OLAP.dbo.Producto_Dim INSERT INTO Cubo_Ventas_OLAP.dbo.Producto_Dim SELECT ProductID,ProductName,CompanyName,CategoryName, UnitsInStock ,UnitPrice,QuantityPerUnit FROM Northwind.dbo.Categories INNER JOIN Northwind.dbo.Products ON Categories.CategoryID = Products.CategoryID INNER JOIN Northwind.dbo.Suppliers ON Products.SupplierID = Suppliers.SupplierID GO

Tabla Northwind.dbo.Shippers  Tabla Cubo_Ventas_OLAP.dbo.Transporte_Dim
INSERT Cubo_Ventas_OLAP.dbo.Transporte_Dim SELECT ShipperID, CompanyName FROM Northwind.dbo.Shippers GO

Tabla Northwind.dbo.Orders  Tabla Cubo_Ventas_OLAP.dbo.Tiempo_Dim
INSERT INTO Cubo_Ventas_OLAP.dbo.Tiempo_Dim SELECT DISTINCT Fecha = s.ShippedDate, Dia = DATENAME(DW,s.ShippedDate ), Mes = DATEPART(MM,s.ShippedDate ), Año = DATEPART(YY,s.ShippedDate), Trimestre = DATEPART(QQ,s.ShippedDate), MesAño = DATENAME(MONTH,s.ShippedDate) + '_'+ DATENAME(YEAR,s.ShippedDate ), DiaSemana = DATEPART(DW, s.ShippedDate), DiaAño = DATEPART(DY, s.ShippedDate), SemanaAño = DatePart(wk,s.ShippedDate )

FROM Northwind.dbo.Orders S WHERE s.ShippedDate IS NOT NULL GO --OBS SELECT DATENAME(DW,GETDATE() ) SELECT DATEPART(DW,GETDATE())

Migrando Datos de las Tablas de Dimensión a la Tabla Ventas_Fact
INSERT INTO Cubo_Ventas_OLAP.dbo.Ventas_Fact SELECT TDIM.TiempoKey, CDIM.ClienteKey , EDIM.EmpleadoKey, PDIM.ProductoKey,SDIM.TransporteKey , --Fecha de Pedido FechaRequeriada = O.RequiredDate, --Fecha de Envio FechaEnvio = O.OrderDate, --Precio Unitario por Producto = PrecioUnitario UnidadesLinea = OD.UnitPrice, --Monto Total por Producto (TotalLinea = PrecioUnitario * Cantidad) TotalLinea = OD.UnitPrice * OD.Quantity, --Costo del Flete CosteFleteLinea = ((O.Freight / (Select SUM(Quantity) From Northwind.dbo.[Order Details] od Where OD.OrderID = O.OrderID)) * OD.Quantity), --Descuento de la Linea DescuentoTotalLinea = ((OD.Discount) * (OD.UnitPrice * OD.Quantity )), --BeneficioTotal = MontoTotal + Flete - Descuento BeneficioTotalLinea = (OD.UnitPrice * OD.Quantity ) + ((O.Freight / (Select SUM(Quantity) From Northwind.dbo.[Order Details] od Where OD.OrderID = O.OrderID)) * OD.Quantity)-((OD.Discount) * (OD.UnitPrice * OD.Quantity )), FROM Northwind.dbo.Orders AS O INNER JOIN Northwind.dbo.[Order Details] AS OD ON O.OrderID = OD.OrderID INNER JOIN Cubo_Ventas_OLAP.dbo.Producto_Dim AS PDIM ON OD.ProductID = PDIM.ProductoID INNER JOIN Cubo_Ventas_OLAP.dbo.Cliente_Dim AS CDIM ON O.CustomerID = CDIM.ClienteID INNER JOIN Cubo_Ventas_OLAP.dbo.Tiempo_Dim AS TDIM ON O.ShippedDate = TDIM.Fecha INNER JOIN Cubo_Ventas_OLAP.dbo.Transporte_Dim AS SDIM ON O.ShipVia = SDIM.TransporteID INNER JOIN Cubo_Ventas_OLAP.dbo.Empleado_Dim AS EDIM ON O.EmployeeID = EDIM.EmpleadoID WHERE O.ShippedDate IS NOT NULL

Tabla Cliente_Dim

Tabla Ventas_Fact

Figura 1: Ejemplo de Esquema en Estrella

Los cubos OLAP son esencialmente las funciones de agregación que se calculan de acuerdo con el esquema en estrella o copo de nieve. Los datos y las agregaciones del cubo pueden almacenarse de diferentes modos: MOLAP, ROLAP, HOLAP. La estructura MOLAP almacena los datos y las agregaciones en una estructura multidimensional. Permite dimensiones que contengan hasta 5 millones de miembros. Es la más eficiente en búsquedas, independiente del gestor y la que requiere mayor tiempo de procesado y de espacio en disco. Una desventaja es que hay que actualizarlo para que incorpore los datos nuevos que vayan entrando al DW. La estructura ROLAP mantiene los datos en la tabla de hechos original y almacena las agregaciones en tablas relacionales de la misma base de datos. Es más lenta la búsqueda pero es válida aunque el tamaño del cubo exceda los 5 Gb, donde MOLAP tiene problemas. La estructura HOLAP mantiene los datos en la tabla de hechos original y almacena las agregaciones en una estructura multidimensional. Como Crear un Cubo OLAP A continuación se establecerán los pasos para crear un cubo OLAP sobre la base de datos Cubo_Ventas_OLAP. Se abre la herramienta SQL Server Business Intelligence Development Studio,eligiendo como tipo de proyecto Analysis Service. Comprobar que el servicio Analysis Services está iniciado. El primer paso es crear un Origen de datos configurándolo hacia la base de datos donde residen los esquemas en estrella. En este caso, la base de datos Cubo_Ventas_OLAP en SQL Server2008. Indicar la carpeta de ubicación qué el usuario utiliza Analysis Services para conectarse a la BD relacional, poner por defecto la cuenta asociada al servicio.

Cubo OLAP Creado

Definir Origen de Datos

1.- Conectando al Servidor Local. 2.- Selecciona Cubo_Ventas_OLAP

1.- Usa la Cuenta de Servicio

Vista de Base de Datos de Origen A continuación se crea un Vista de los orígenes de datos que recoja el esquema de nuestra estrella. Los proyectos de proceso analítico en línea (OLAP) y minería de datos de Microsoft SQL Server se diseñan basándose en un modelo de datos lógico de tablas, vistas y consultas relacionadas de uno o varios orígenes de datos. Este modelo de datos lógico se denomina vista de origen de datos. Una vista de origen de datos es un objeto que contiene los metadatos de objetos de origen de datos seleccionados, incluidas las relaciones entre estos objetos definidos en el origen de datos subyacente o en la vista de origen de datos. Una vista de origen de datos almacena en caché los metadatos de los orígenes de datos a partir de los cuales se genera. Los metadatos almacenados en caché le permiten desarrollar un proyecto de Analysis Services sin tener una conexión activa continua con el origen de datos.

Cubo En este momento ya se pueden definir los cubos que sean necesarios para nuestro Data Warehouse. Para ello se selecciona la opción “Nuevo cubo (New Cube)” “Asistente” que arrancará el asistente de creación de cubos.

El asistente presenta la pantalla

Pantalla incial de Asistente para la generación de Cubos

Al pulsar “Siguiente>>”, presenta la pantalla de la Figura donde se seleccionará la vista del origen de datos que proporcionará los datos al cubo.

Figura. Selección de la vista de origen de datos y tabla de hechos

A continuación, tras pulsar “Siguiente >” se presenta la pantalla de la Figura donde el asistente detecta las medidas a crear.

A continuación muestra las dimensiones que detecta y crea además las jerarquías subyacentes en función de las relaciones que encuentra (puede que no tengan sentido para nosotros). Hay jerarquías de atributo (se crean para cada atributo de la tabla de dimensión) y jerarquías de usuario (que constan de varios niveles). A continuación se confirman o modifican las tablas de hechos y dimensiones detectadas por el asistente (Figura).

Figura. Identificación de tabla de hechos y dimensiones

Por último se observa el cubo definido (Figura) Figura. Cubo definido

Ahora vamos a revisar las medidas definidas. Se puede observar en carpeta Propiedades la operación definida sobre cada una de las medidas. Todas ellas tienen la operación SUM por defecto, a excepción del atributo Recuento Ventas _Fact que es COUNT. Una vez diseñado el cubo hay que construirlo. Para ello se elige la opción Procesar del menú Generar y se pulsa Ejecutar, sino hay ningún error se mostrará la imagen de la Figura.

Click en Change Settings

ok

Run

Close

Figura: Cubo Construido Ahora ya podemos utilizarlo (construir consultas) desde la carpetilla (Browser) Examinador.

Se observa que las dimensiones no ofrecen atributos ni jerarquías de interés por lo que hay que editarlas y modificarlas. Construir Dimensiones Comenzamos revisando la dimensión Producto. Para ello pulsamos doble clic sobre la dimensión en la ventana del Explorador de soluciones. Vemos que por defecto el asistente solo asigna el atributo clave. Así que incorporaremos a la dimensión los distintos atributos por los que se quiera consultar. También crearemos dos jerarquías de usuario: categoría producto y suministrador producto Consideraremos mínimo Stock y obsoleto como propiedades del nombre del producto pues no tiene mucho sentido como atributo de consulta, aunque en la dimensión se mantendrá (se establece en versión 2008 en la carpetilla Relaciones de atributos). La idea de las propiedades es poder mostrar esta información en vez de navegar por la jerarquía de atributos para verla. Nota en Versión 2005: hay que establecer la Cardinalidad a 1 en la relación del atributo (un producto tiene un mínimo stock y solo una situación de obsoleto). En versión 2008: se hace por medio del establecimiento de las relaciones de atributo (ver Figura 14). Para cada tabla incluida en una dimensión, hay una relación de atributos que relaciona el atributo clave de la tabla con otros atributos en esa tabla. Esto tiene como ventaja: - Reducir la cantidad de memoria necesaria para procesar la dimensión. Esto acelera el procesamiento de dimensiones, particiones y consultas. - Aumentar el rendimiento de las consultas porque el acceso al almacenamiento es más rápido y se optimizan mejor los planes de ejecución. - Hacer que los algoritmos de diseño de agregaciones seleccionen agregados más efectivos, siempre y cuando las jerarquías definidas por el usuario se hayan establecido a lo largo de las rutas de acceso de la relación.

La principal restricción al crear una relación de atributos consiste en asegurarse de que el atributo al que la relación de atributos hace referencia no tenga más de un valor para ningún miembro en el atributo al que pertenece la relación de atributos. Por ejemplo, si se define una relación entre un atributo ProductoNombre y una CategoriaNombre, cada productoNombre sólo puede relacionarse con una única CategoriaNombre.

Definir Dimension

Definir Relaciones de Atributo Al explorar la dimensión, podemos seleccionar cada uno de los atributos o jerarquías y visualizar las propiedades de sus miembros al pulsar el botón Propiedades (Figura).

Recíprocamente quedando así:

Nos Ubicamos en el Browser: Si vemos los datos de la Jerarquía, ésta solo contiene números, los que representa la clave (ProdutoKey).Si queremos que en vez de mostrar la Clave muestre el Nombre,cambiamos la propiedad NameColumn, además ya creada las Jerarquias Categoria – Producto,Suministrador Producto

Seleccionamos ProductNombre

Ejecutamos Actualizamos

En la dimensión Empleado, Si vemos los datos de la jerarquía, ésta solo contiene números, los que representa la clave (empleadoKey). Si queremos que en vez de mostrar la clave muestre el nombre, cambiamos la propiedad NameColumn (Figura). Además crearemos la jerarquía Puesto empleado.

Figura. Dimensión empleado cambiada por la relación primario- Clave

Por último está la dimensión temporal. Crearemos las jerarquías especificadas en la Figura. Observar que aunque la jerarquía Año-trimestre-mes-dia tiene el atributo mes, se ha puesto en NameColumn el MesAño para que salga el texto y no el número, también podemos elegir el atributo MesAño. Además se ha establecido la ordenación de cada atributo por key y no por name para que la ordenación sea numérica y no alfanumérica.

En la Dimensión Cliente crearemos las jerarquías que se muestran en la Figura.

En la Dimensión Transporte crearemos las jerarquías que se muestran en la Figura

Propiedades de las Dimensiones A continuación se comentarán algunas propiedades de las dimensiones que permiten personalizar el comportamiento de las mismas.

Propiedades dimensión: AttributeAllMemberName: texto que se mostrará para el nivel superior (Todos) Default member: El miembro predeterminado se utiliza cuando se evalúa una celda y no hay ningún otro miembro especificado para la dimensión (condición por la cuál se hace el browse de los datos). Esta es utilizada si la dimensión no está incluida en una consulta. Por defecto el Analysis Server incluye todas las dimensiones en la consulta para que luego el usuario haga los filtros. Member keys unique: Indica si las claves de miembro son únicas a través de toda la dimensión. Member name unique: Indica si los nombres de miembros son únicos a través de toda la dimensión. Caso de una dimensión versionada. Storage Mode: modo de almacenamiento Molap o Rolap. Propiedades nivel: Member key column: Indica el nombre de la columna que contiene las claves de miembro. Member name column: Indica el nombre de la columna que contiene el nombre de los miembros. Este valor puede ser un campo o una concatenación de ellos ("producto"."producto_nombre" + ‘ ‘ + "producto"."producto_version") 1.2.2. Elegir cómo ordenar los miembros de un nivel. Member key column tiene un número entero que referencia a cada miembro. Member name column es el título de la columna que se muestra en el cubo. Order by campo por el que se establece la ordenación. Por defecto, las dos primeras propiedades toman el mismo valor pero al independizarlas permite establecer la ordenación, como se puede observar en la dimensión Empleado (EmpleadoKey y EmpleadoApellidosNombre). 1.3. Definir medidas y miembros calculados en los Cubo. Un cubo debe contener al menos una dimensión y una medida. La medida más simple corresponde a un campo numérico de la tabla de hechos. Pero es posible también crear medidas. Por ejemplo, vamos a crear la medida COMISION como el 15% de total de la línea y el nº de pedidos como la cuenta de distintos pedidosID. Para ello se pulsa sobre la sección de Medidas y se indica Nueva medida. Se seleciona el atributo sobre el que se construirá la medida derivada (por ejemplo PedidoID) y luego en propiedades se establecerá la función de agregación y su nombre (Ver Figura).

Para el caso de la comisión, no nos deja establecer la función de cálculo en la versión Standard Edition, lo que podemos resolver, creando este campo en la vista del origen de datos, a través de crear un nuevo cálculo con nombre en la tabla de hechos (Ver Figura) y luego agregarla al grupo de medidas del cubo. Crear Medida Comisión

Por defecto, la función de agregación de cualquier medida es la suma. Si quisiéramos crear un indicador (ratio) que muestre el margen neto obtenido ( = beneficio / total) para que sea correcto, se debe realizar la agregación antes de la división. Por ello es necesario crear un miembro calculado. La diferencia entre medida y miembro calculado es cuándo el cálculo se realiza. Una medida derivada se calcula antes que las agregaciones sean creadas y los valores son almacenados en el cubo. Un miembro calculado se calcula las agregaciones y los miembros no son almacenados en el cubo. Como ejemplo vamos a calcular el margen neto que se ha conseguido en las ventas. Poner la propiedad Format String a Porcentaje. Y también puedes poner un código de colores para que se marque cuando está por encima o por debajo de un determinado valor.

CREATE MEMBER CURRENTCUBE.[Measures].MargenNeto AS [Measures].[Benefio Total Linea]/[Measures].[Total Linea], FORMAT_STRING = "Percent", FORE_COLOR = iif ( MargenNeto <0.9,255/*Red*/,65280,/*Lime*/), VISIBLE = 1 ;

Crear Métrica Calculada de MargenNeto

A continuación se observa el resultado.

También se puede calcular la aportación de cada miembro de la dimensión producto al beneficio total, para saber qué productos son los que más beneficios nos aportan (Ver Figura).
CREATE MEMBER CURRENTCUBE.[MEASURES].[Aportacion (Ratio) del Producto al Beneficio Total] AS [MEASURES].[Benefio Total de Linea]/ ( Root ([Producto dim]), [MEASURES].[Beneficio Total Linea]), FORMAT_STRING = "Percent", VISIBLE = 1;

A continuación se observa el resultado.

Sign up to vote on this title
UsefulNot useful