Sunteți pe pagina 1din 11

“Año del Centenario de Machupicchu para el Mundo”

UNIVERSIDAD NACIONAL “SAN LUIS GONZAGA” DE ICA FACULTAD: INGENIERIA DE SISTEMAS <TEMA: CURSO :
UNIVERSIDAD NACIONAL
“SAN LUIS GONZAGA”
DE ICA
FACULTAD:
INGENIERIA DE SISTEMAS
<TEMA:
CURSO
: IMPLEMENTACION DE BASE DE DATOS
DOCENTE
: Ing. Román Munive, Wilder Enrique
INTEGRANTES
:
 ANGULO MENDEZ , Angelo
 LEVANO CASTILLA, Carlos
 PARDO FIGUEROA HERENCIA, Jhonatan
 RAMIREZ GAMBOA, Marlon

GONSULTAS DE REFRENCIA CRUZADA VIRTUALIZACION DE DATOS EN FILAS Y COLUMNAS

QUISPE ARCOS, Hans

CICLO

: VII

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 visualización de datos en filas y columnas para una mejor presentación 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 Méndez Angelo Rafael

Levano Castilla Carlos

Pardo Figueroa Herencia Jhonatan

Quispe Arcos Hans

Ramirez Gamboa Marlon

Los recursos utilizados para la presente investigación solo serán que el participante tenga una computadora disponible con MS SQL SERVER instalado y Microsoft Access. El tiempo de investigación recomendado serán 10 min por parte teórica y 10 por laboratorio se recomienda ir progresivamente sin adelantarse puntos, el intentar hacer una parte practica antes de leer la teórica podrá originar no entender el código

El tema es de un nivel intermedio/avanzado por lo tanto se recomienda un análisis más profundo por parte del participante ya que el mismo le servirá para mostrar datos de manera más profesional.

2. OBJETIVOS

Dar a conocer sobre visualización datos de manera más profesional

Practicar las sentencias para crear consultas cruzadas

3. MARCO CONCEPTUAL

Uno de los problemas más comunes en la programación es la poca experiencia en algunas herramientas, y esto es cuando se requiere crear nuevos algoritmos y más cuando no se sabe, pero gracias a Dios existe el Internet y existen artículos que nos simplifican la vida. Este artículo habla sobre unos de los problemas quizás más comunes en la generación de una aplicación: cuando nos enfrentamos al típico 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 año están en diferentes filas pero imperiosamente necesitamos que sean columnas.

Cuando queremos representar una consulta sumaria con dos columnas de agrupación como una tabla de doble entrada en la que cada una de las columnas de agrupación 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

La sentencia SELECT En la SELECT la columna fija es la columna que define el encabezado de filas, el origen que indicamos en la cláusula FROM es la tabla (o tablas) de donde sacamos la información, y en la cláusula GROUP BY ponemos la columna que va a definir las filas del resultado. La SELECT puede contener una cláusula WHERE para seleccionar la filas que se utilizan para calcular el resultado, puede contener subconsultas pero no la cláusula HAVING.

La sentencia PIVOT En la cláusula PIVOT indicamos la columna cuyos valores van a definir columnas dinámicas del resultado a esta columna la llamaremos pivote.

La sentencia IN La cláusula IN permite definir el conjunto de valores que queremos que aparezcan como columnas dinámicas.

Por ejemplo queremos obtener las ventas mensuales de nuestros empleados. Tenemos que diseñar una consulta sumaria calculando la suma de los importes de los pedidos agrupando por empleado y mes de la venta. La consulta sería:

SELECT rep as empleado,month(fechapedido)as mes,sum(importe)as vendido FROM pedidosGROUPBY rep,month(fechapedido)

vendido FROM pedidosGROUPBY rep,month(fechapedido) La consulta quedaría mucho más elegante y clara

La consulta quedaría mucho más elegante y clara presentando los datos en un formato más compacto como el siguiente:

TRANSFORM Sum(importe)

SELECT rep as empleadoFROM pedidos GROUPBY repPIVOTmonth(fechapedido)

as empleadoFROM pedidos GROUPBY repPIVOTmonth(fechapedido) Pues este último resultado se obtiene mediante una consulta

Pues este último resultado se obtiene mediante una consulta de referencias cruzadas. Observar que una de las columnas de agrupación (rep) sigue definiendo las filas que aparecen (hay una fila por cada empleado), mientras que la otra columna de agrupación (mes) ahora sirve para definir las otras columnas, cada valor de mes define una columna en el resultado, y la celda en la intersección de un valor de rep y un valor de mes es la columna resumen, la que contiene la función de columna (la suma de importe).

Las consultas de referencias cruzadas se pueden crear utilizando el asistente, es mucho más cómodo pero es útil saber cómo hacerlo directamente en SQL por si queremos variar algún 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 continuación, 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

(

<función de agregación>(<columna que se agrega>)

FOR

[<columna que contiene los valores que se convertirán en encabezados de columna>]

IN ([primera columna dinamizada], [segunda columna dinamizada]

[última columna dinamizada])

) AS <alias de la tabla dinamizada>

<cláusula ORDER BY opcional>;

En el ejemplo de código 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

AverageCost

0

5.0885

1

223.88

2

359.1082

4

949.4105

No hay productos definidos con tres DaysToManufacture.

En el código 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] días, 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

0

1

2

3

4

AverageCost

5.0885

223.88

359.1082

NULL

949.4105

4. PROCEDIMIENTOS

El problema que encontramos es que la función pívot hace que el código sea Estático 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 año 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

, [Marzo] , [Abril] , [Mayo] )) AS Child order by 1 Para poder ayudar a

Para poder ayudar a la función a volverse Dinamica usaremos la construcción 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 restricción muy importante el operador PIVOT sólo 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 añade 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 añadira 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 implementación de PIVOT dinámico podrían usarse tablas emporables , variables del tipo

Dentro de la implementación de PIVOT dinámico podrían usarse tablas emporables,variables del tipo TABLE y/o CTEs en lugar de emplearse subconsultas, en todo caso los resultados serán los mismos, sin embargo el rendimiento podría ser mejor, y la lógica se simplificaría bastante.

Ahora veremos que en Microsoft Access es mucho más sencillo.

Tenemos la Tabla detalle de ventas donde nos muestra cómo según el id empleado se puede saber el monto de la venta y la fecha en que se realizo.

de ventas donde nos muestra cómo según el id empleado se puede saber el monto de

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

En el menú Crear presionamos en Asistente para consultas, seleccionamos Asistente de tabla de ref. cruzadas
En el menú Crear presionamos en Asistente para consultas, seleccionamos Asistente de tabla de ref. cruzadas
Le Damos doble click a fecha de Orden

Le Damos doble click a fecha de Orden

Le Damos doble click a fecha de Orden
Le Damos doble click a fecha de Orden

El resultado será:

El resultado será: Que da una vista más fácil de analizar para la tabla 5. CONCLUSIONES

Que da una vista más fácil de analizar para la tabla

Que da una vista más fácil de analizar para la tabla 5. CONCLUSIONES Con los laboratorios

5. CONCLUSIONES

Con los laboratorios antes realizados, se ha podido notar la manera de realizar referencias cruzadas para operaciones frecuentes en sistemas de información y su utilidad que ello conlleva. Si bien en estos laboratorios no se ha podido mostrar una comparativa con respecto a tiempos de ejecución, 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, además del tráfico y cantidad de usuarios, usar un procedimiento almacenado resulta en un código más limpio, rapidez y eficacia en resultados

Esto es especialmente útil cuando es imposible mediante una sentencia el rescatar toda la información que el usuario requiere, como por ejemplo en una factura del servicio telefónico que está sujeta a promociones, tipos de cliente, tipos de llamadas, localidades, horarios pico y no pico, etc.

6. REFERENCIAS

VIRTUALIZACION

Consultas de referencia cruzadas

PIVOT DINAMICO