You are on page 1of 11

Ao del Centenario de Machupicchu para el Mundo

UNIVERSIDAD NACIONAL

SAN LUIS GONZAGA


DE ICA

FACULTAD:

INGENIERIA DE SISTEMAS
<

TEMA:

GONSULTAS DE REFRENCIA CRUZADA VIRTUALIZACION DE DATOS EN FILAS Y COLUMNAS


CURSO DOCENTE
INTEGRANTES

: IMPLEMENTACION DE BASE DE DATOS : Ing. Romn Munive, Wilder Enrique


:

ANGULO MENDEZ , Angelo LEVANO CASTILLA, Carlos PARDO FIGUEROA HERENCIA, Jhonatan RAMIREZ GAMBOA, Marlon QUISPE ARCOS, Hans : VII

CICLO

ICA PERU 2011

1. INTRODUCCION
El presente trabajo realizado por nosotros alumnos de la Universidad Nacional San Luis Gonzaga de Ica se trata de Referencias Cruzadas y Virtualizacion de datos en filas y columnas. Se investigara sobre la forma de visualizacin de datos en filas y columnas para una mejor presentacin de la data almacenada Con el presente taller se espera que los alumnos puedan conocer o reforzar los conocimientos sobre procesamiento en Data. Las personas a cargo del presente taller de laboratorio son los encargados del equipo 2 conformado por: Angulo Mndez Angelo Rafael Levano Castilla Carlos Pardo Figueroa Herencia Jhonatan Quispe Arcos Hans Ramirez Gamboa Marlon Los recursos utilizados para la presente investigacin solo sern que el participante tenga una computadora disponible con MS SQL SERVER instalado y Microsoft Access. El tiempo de investigacin recomendado sern 10 min por parte terica y 10 por laboratorio se recomienda ir progresivamente sin adelantarse puntos, el intentar hacer una parte practica antes de leer la terica podr originar no entender el cdigo El tema es de un nivel intermedio/avanzado por lo tanto se recomienda un anlisis ms profundo por parte del participante ya que el mismo le servir para mostrar datos de manera ms profesional.

2. OBJETIVOS
Dar a conocer sobre visualizacin datos de manera ms profesional Practicar las sentencias para crear consultas cruzadas

3. MARCO CONCEPTUAL
Uno de los problemas ms comunes en la programacin es la poca experiencia en algunas herramientas, y esto es cuando se requiere crear nuevos algoritmos y ms cuando no se sabe, pero gracias a Dios existe el Internet y existen artculos que nos simplifican la vida. Este artculo habla sobre unos de los problemas quizs ms comunes en la generacin de una aplicacin: cuando nos enfrentamos al tpico dilema de que tenemos muchas filas en una tabla y queremos, o bien nos piden, que dichas filas sean columnas en una grilla; en especial cuando los detalles de un ao estn en diferentes filas pero imperiosamente necesitamos que sean columnas. Cuando queremos representar una consulta sumaria con dos columnas de agrupacin como
una tabla de doble entrada en la que cada una de las columnas de agrupacin es una entrada de la tabla utilizaremos una consulta de tabla de referencias cruzadas.

Para server 2000 se usaba


La sentencia TRANSFORM La sentencia TRANSFORM es la que se utiliza para definir una consulta de referencias cruzadas. La sintaxis es la siguiente:

La sentencia SELECT En la SELECT la columna fija es la columna que define el encabezado de filas, el origen que indicamos en la clusula FROM es la tabla (o tablas) de donde sacamos la informacin, y en la clusula GROUP BY ponemos la columna que va a definir las filas del resultado. La SELECT puede contener una clusula WHERE para seleccionar la filas que se utilizan para calcular el resultado, puede contener subconsultas pero no la clusula HAVING. La sentencia PIVOT En la clusula PIVOT indicamos la columna cuyos valores van a definir columnas dinmicas del resultado a esta columna la llamaremos pivote. La sentencia IN La clusula IN permite definir el conjunto de valores que queremos que aparezcan como columnas dinmicas. Por ejemplo queremos obtener las ventas mensuales de nuestros empleados. Tenemos que disear una consulta sumaria calculando la suma de los importes de los pedidos agrupando por empleado y mes de la venta. La consulta sera: SELECT rep as empleado,month(fechapedido)as mes,sum(importe)as vendido FROM pedidosGROUPBY rep,month(fechapedido)

La consulta quedara mucho ms elegante y clara presentando los datos en un formato ms compacto como el siguiente: TRANSFORM Sum(importe)

SELECT rep as empleadoFROM pedidos GROUPBY repPIVOTmonth(fechapedido)

Pues este ltimo resultado se obtiene mediante una consulta de referencias cruzadas. Observar que una de las columnas de agrupacin (rep) sigue definiendo las filas que aparecen (hay una fila por cada empleado), mientras que la otra columna de agrupacin (mes) ahora sirve para definir las otras columnas, cada valor de mes define una columna en el resultado, y la celda en la interseccin de un valor de rep y un valor de mes es la columna resumen, la que contiene la funcin de columna (la suma de importe). Las consultas de referencias cruzadas se pueden crear utilizando el asistente, es mucho ms cmodo pero es til saber cmo hacerlo directamente en SQL por si queremos variar algn dato una vez realizada la consulta con el asistente o si queremos definir una consulta de referencias cruzadas que no se puede definir con el asistente. Pero para versiones desde 2005 a 2008 tenemos que usar PIVOT.
A continuacin, se muestra una sintaxis anotada de PIVOT. SELECT <columna no dinamizada>, [primera columna dinamizada] AS <nombre de columna>, [segunda columna dinamizada] AS <nombre de columna> ... [ltima columna dinamizada] AS <nombre de columna> FROM (<la consulta SELECT que genera los datos>) AS <alias de la consulta de origen> PIVOT ( <funcin de agregacin>(<columna que se agrega>) FOR [<columna que contiene los valores que se convertirn en encabezados de columna>]

IN ([primera columna dinamizada], [segunda columna dinamizada] ... [ltima columna dinamizada]) ) AS <alias de la tabla dinamizada> <clusula ORDER BY opcional>; En el ejemplo de cdigo siguiente se genera una tabla de dos columnas con cuatro filas.

USE AdventureWorks2008R2 ; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product GROUP BY DaysToManufacture;
El conjunto de resultados es el siguiente. DaysToManufacture 0 1 2 4 AverageCost 5.0885 223.88 359.1082 949.4105

No hay productos definidos con tres DaysToManufacture. En el cdigo siguiente se muestra el mismo resultado, dinamizado para que los valores de DaysToManufacture se conviertan en encabezados de columna. Se proporciona una columna para tres [3] das, aunque los resultados sonNULL.

-- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable;

El conjunto de resultados es el siguiente. Cost_Sorted_By_Production_Days AverageCost 0 5.0885 1 223.88 2 359.1082 3 NULL 4 949.4105

4. PROCEDIMIENTOS
El problema que encontramos es que la funcin pvot hace que el cdigo sea Esttico al tener que mencionar cada registro para poder tenerlo como columna. Ejememplo en Northwind: Monto Suma de las ventas mensuales por empleado en los 5 primeros meses del ao 1998

SELECT * FROM (SELECT o.EmployeeID, DATENAME(month,O.OrderDate ) PIV, sum(OD.UnitPrice * OD.Quantity) AS Monto FROM Orders O INNER JOIN [Order Details] OD on OD.OrderID=O.OrderID where YEAR(o.OrderDate) =1998 Group by o.OrderID,o.EmployeeID,DATENAME(month,O.OrderDate ) )PIV PIVOT (SUM(Monto) FOR PIV IN ([Enero],[Febrero], [Marzo],[Abril],[Mayo] )) AS Child order by 1

Para poder ayudar a la funcin a volverse Dinamica usaremos la construccin de cadenas en partes y dentro de un while que luego ejecutaremos como una sentencia. Ahora realizaremos un ejemplo con la base de datos Northwind pero para ello debemos tener presente una restriccin muy importante el operador PIVOT slo trabaja con base de datos cuyo

nivel de compatibilidad mayor o igual a 90 (SQL Server 2005). Northwind es una base de datos creada con SQL Server 2000, y por lo tanto su nivel de compatibilidad es 80. Para solucionar este problema debemos obviamente cambiar dicho nivel de compatibilidad a 90. Para ello ejecutaremos DECLARE @CatPVT AS NVARCHAR(MAX), @Categorias AS varchar(20) DECLARE @CatID INT --Creamos variables para almacenar la cadena, --las categorias,el id de las categotias SET @CatID=(SELECT MIN(CategoryID) FROM Categories) SET @Categorias = ( SELECT CategoryName FROM Categories WHERE CategoryID = @CatID) --la categoria con el id mas bajo que seria idcategoria 1 Beverages SET @CatPVT = N'' --la cadena donde acumularemos las columnas que queremos tener al final del pivot WHILE @Categorias IS NOT NULL BEGIN SET @CatPVT = @CatPVT + N',['+ @Categorias +N']' --se aade el nombre almacenado SET @Categorias = (SELECT TOP(1) CategoryName FROM Categories WHERE CategoryID > @CatID ORDER BY CategoryID ASC) --se selecciona el siguiente nombre dentro de la tabla categorias SET @CatID=(SELECT MIN(CategoryID) FROM Categories Where Categoryname=@Categorias) --se reemplaza el ultimo id por el ide que se acaba de aumentar --y se repite el iclo END print @CatPVT SET @CatPVT = SUBSTRING(@CatPVT, 2, LEN(@CatPVT)) print 'ok' print @CatPVT --se le quita la , al incicio de la cadena DECLARE @sql AS nvarchar(MAX) --aqui tenemos la cadena que se ejecutara --y a donde se le aadira la subcadena que contiene las columnas SET @sql = N'SELECT * FROM (SELECT P.ProductID, C.CategoryName, (OD.UnitPrice * OD.Quantity) AS Monto FROM Products P INNER JOIN dbo.[Order Details] OD ON P.ProductID=OD.ProductID INNER JOIN Categories C ON C.CategoryID=P.CategoryID ) PIV PIVOT (SUM(Monto) FOR CategoryName IN ('+ @CatPVT + ')) AS Child order by 1' print @sql EXEC sp_executesql @sql

Dentro de la implementacin de PIVOT dinmico podran usarse tablas emporables,variables del tipo TABLE y/o CTEs en lugar de emplearse subconsultas, en todo caso los resultados sern los mismos, sin embargo el rendimiento podra ser mejor, y la lgica se simplificara bastante.

Ahora veremos que en Microsoft Access es mucho ms sencillo. Tenemos la Tabla detalle de ventas donde nos muestra cmo segn el id empleado se puede saber el monto de la venta y la fecha en que se realizo.

En el men Crear presionamos en Asistente para consultas, seleccionamos Asistente de tabla de ref. cruzadas

Le Damos doble click a fecha de Orden

El resultado ser:

Que da una vista ms fcil de analizar para la tabla

5. CONCLUSIONES
Con los laboratorios antes realizados, se ha podido notar la manera de realizar referencias cruzadas para operaciones frecuentes en sistemas de informacin y su utilidad que ello conlleva. Si bien en estos laboratorios no se ha podido mostrar una comparativa con respecto a tiempos de ejecucin, pues con esta clase de consultas y la cantidad de datos los tiempos de respuestas son cortos. Se deja en claro que si adecuamos esto al tiempo y frecuencia de uso de dichas sentencias, adems del trfico y cantidad de usuarios, usar un procedimiento almacenado resulta en un cdigo ms limpio, rapidez y eficacia en resultados Esto es especialmente til cuando es imposible mediante una sentencia el rescatar toda la informacin que el usuario requiere, como por ejemplo en una factura del servicio telefnico que est sujeta a promociones, tipos de cliente, tipos de llamadas, localidades, horarios pico y no pico, etc.

6. REFERENCIAS
VIRTUALIZACION http://msdn.microsoft.com/es-es/library/bb972215.aspx Consultas de referencia cruzadas http://www.aulaclic.es/sql/t_7_1.htm PIVOT DINAMICO

http://geeks.ms/blogs/ozonicco/archive/2007/12/28/implementaci-243-n-de-pivot-din-225mico.aspx

You might also like