Está en la página 1de 7

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL

CUSCO
FACULTAD DE INGENIERIA ELECTRICA, ELECTRONICA, INFORMATICA Y
MECANICA
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y DE SISTEMAS

LABORATORIO N° 7

ALUMNO:
Rojas Cahuana Etson Ronaldao
ASIGNATURA:
Fundamentos y Diseño de Bases de
Datos
Docente: Medina Miranda Karelia
Semestre:
2020-I
CUSCO-PERU
2020
5. ACTIVIDADES COMPLEMENTARIAS
5.1.- Investigar los comandos PIVOT y UNPIVOT del SQL SERVER y
presentarlo como trabajo monográfico.
Puedes usar el PIVOT y UNPIVOT operadores relacionales para cambiar una expresión con valores
de tabla a otra tabla. PIVOT rota una expresión con valores de tabla al convertir los valores únicos de
una columna en la expresión en múltiples columnas en la salida, y realiza agregaciones donde se
requieren en cualquier valor de columna restante que se desee en el resultado final. UNPIVOT realiza
la operación opuesta a PIVOT al rotar las columnas de una expresión con valores de tabla en valores
de columna.
La sintaxis para PIVOT proporciona es más simple y más legible que la sintaxis que de otro modo
podría especificarse en una serie compleja de sentencias SELECT ... CASE. Para una descripción
completa de la sintaxis de PIVOT.
Sintaxis
La siguiente sintaxis resume cómo usar el operador PIVOTE.
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

Ejemplo Básico de Pivote


El siguiente ejemplo de código produce una tabla de dos columnas que tiene cuatro filas.

USE AdventureWorks2014 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost
FROM Production.Product
GROUP BY DaysToManufacture;

Aquí está el conjunto de resultados..

DaysToManufacture AverageCost
----------------- -----------
0 5.0885
1 223.88
2 359.1082
4 949.4105

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 1


No se definen productos con tres DaysToManufacture.
El siguiente código muestra el mismo resultado, pivotado para que los valores DaysToManufacture
se conviertan en los títulos de las columnas. Se proporciona una columna por tres [3] días, aunque los
resultados sean NULL.
-- 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;

Aquí está el conjunto de resultados..


Cost_Sorted_By_Production_Days 0 1 2 3 4
------------------------------ ----------- ----------- ----------- ----------- -----------
AverageCost 5.0885 223.88 359.1082 NULL 949.4105

UNPIVOT realiza casi la operación inversa de PIVOT, al rotar columnas en filas. Supongamos que
la tabla producida en el ejemplo anterior se almacena en la base de datos como pvt, y desea rotar los
identificadores de columna Emp1, Emp2, Emp3, Emp4 y Emp5 en valores de fila que corresponden
a un proveedor en particular. Esto significa que debe identificar dos columnas adicionales. La
columna que contendrá los valores de columna que está rotando (Emp1, Emp2, ...) se llamará
Empleado, y la columna que contendrá los valores que actualmente residen bajo las columnas que se
rotarán se llamará Órdenes. Estas columnas corresponden a pivot_column y value_column,
respectivamente, en la definición de Transact-SQL. Aquí está la consulta.

-- Create the table and insert values as portrayed in the previous


example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
-- Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

Aquí está el conjunto de resultados.

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 2


VendorID Employee Orders
----------- ----------- ------
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5

Tenga en cuenta que UNPIVOT no es el reverso exacto de PIVOT. PIVOT realiza una agregación y,
por lo tanto, combina posibles filas múltiples en una sola fila en la salida. UNPIVOT no reproduce el
resultado original de la expresión con valores de tabla porque las filas se han fusionado. Además, los
valores nulos en la entrada de UNPIVOT desaparecen en la salida, mientras que puede haber valores
originales nulos en la entrada antes de la operación PIVOTE.

5.2. Presentar la solución de los ejercicios 2 y 3 de la presente guía


Problema 2.- Determinar los importes prestados y los saldos por cobrar en cada mes del 2007 en
las comunidades C001, C002 y C003.
R(Mes, C001_Pres, C001_Sal, C002_Pres, C002_Sal, C003_Pres, C003_Sal)

SOLUCION:
/* **************************************************************
***** PROBLEMA 2 *****
************************************************************** */
/*
Determinar los importes prestados y los saldos por cobrar en cada mes del
2007 en las comunidades
C001, C002 y C003.
R(Mes, C001_Pres, C001_Sal, C002_Pres, C002_Sal, C003_Pres, C003_Sal)
*/
begin
--Obtener una tabla temporal prestamo donde el año es 2007
select *
into #T3
from Prestamo
where YEAR(FechaPrestamo)= 2007
--Obtener una tabla sumando un saldo del año 2007
SELECT P.CodPrestatario, P.DocPrestamo,
P.FechaPrestamo,P.Importe,(P.Importe - Sum(IsNull(A.Importe,0))) AS Saldo
into #T4
FROM #T3 P LEFT OUTER JOIN AMORTIZACION A
ON P.DocPrestamo = A.DocPrestamo
GROUP BY P.CodPrestatario, P.DocPrestamo, P.FechaPrestamo,
P.Importe
--tabla para seleccionar el codigo prestatario, mes, importe y
saldo

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 3


select CodPrestatario,Mes = MONTH(FechaPrestamo), Importe, Saldo
into #T5
from #T4
--Union natural la tabla 5 con prestatario para obtener el mes ,
CodComunidad, importe, saldo
select Mes, CodComunidad, Importe,Saldo
into #T6
from #T5 t inner join Prestatario p
on t.CodPrestatario = p.CodPrestatario

--Tabla cruzada con los campos pedidos


select Mes,
"C001_Pres" = sum(case when CodComunidad = 'C001' then
Importe else 0 end),
"C001_Sal" = sum(case when CodComunidad = 'C001' then
Saldo else 0 end),
"C002_Pres" = sum(case when CodComunidad = 'C002' then
Importe else 0 end),
"C002_Sal" = sum(case when CodComunidad = 'C002' then
Saldo else 0 end),
"C003_Pres" = sum(case when CodComunidad = 'C003' then
Importe else 0 end),
"C003_Sal" = sum(case when CodComunidad = 'C003' then
Saldo else 0 end)
from #T6
group by Mes
end;
--Limpiar tablas
drop table #T3
drop table #T4
drop table #T5
drop table #T6

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 4


Problema 3.- Determinar los importes prestados en cada mes del 2007 en todas las comunidades.
Por ejemplo, si hay 5 comunidades la tabla resultante debe ser similar a:
R(Mes, C001, C002, C003, C004, C005)
Nota.- No se conoce el número de comunidades.

SOLUCION:

/* **************************************************************
***** PROBLEMA 3 *****
************************************************************** */
/*Determinar los importes prestados en cada mes del 2007 en todas las
comunidades. Por ejemplo, si
hay 5 comunidades la tabla resultante debe ser similar a:
R(Mes, C001, C002, C003, C004, C005)
Nota.- No se conoce el número de comunidades.
*/

begin
--Crear una tabla conteniendo donde el año sea 2007 con los
parametros CodPrestatario, Mes, Importe
select CodPrestatario,Mes = MONTH(FechaPrestamo), Importe
into #T7
from Prestamo
where YEAR(FechaPrestamo)= 2007
--Union natural de Prestatario con la tabla anterior para obtener
la comunidad
select Mes, CodComunidad, Importe
into #T8
from #T7 t inner join Prestatario p
on t.CodPrestatario = p.CodPrestatario
--Seleccionar el codigo de comunidad y ordenarlo
select distinct CodComunidad = cast(CodComunidad as varchar(2000))
into #Comunidad
from Comunidad
order by CodComunidad;
--Declarar las variables para la tabla cruzada dinamica
declare @Comunidades varchar(2000);
set @Comunidades = '';
update #Comunidad
set @Comunidades = CodComunidad = @Comunidades+',' + CodComunidad;
set @Comunidades = SubString(@Comunidades,2,2000);
declare @TextoSQL varchar(2000);
declare @Posicion int;
declare @CodComunidad varchar(12);
set @TextoSQL = 'SELECT Mes '
--Bucle de la tabla cruzada dinamica
while @Comunidades <> ''
begin
set @Posicion = CharIndex(',',@Comunidades);
if @Posicion > 0
begin
set @CodComunidad =
SubString(@Comunidades,1,@Posicion-1);

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 5


set @Comunidades = SubString(@Comunidades
,@Posicion+1,2000);
end
else
begin
set @CodComunidad = @Comunidades;
set @Comunidades = '';
end;
set @TextoSQL = @TextoSQL + ',"'+@CodComunidad+'"=SUM(case
when CodComunidad =
'''+@CodComunidad + ''' then Importe
else ''0'' end)';
end;
set @TextoSQL = @TextoSQL + ' FROM #T8 GROUP BY Mes';
--Ejecutar
exec(@TextoSQL)
--Limpiar tablas
drop table #T7
drop table #T8
drop table #Comunidad
end;

UNSAAC – FUNDAMENTOS Y DISEÑO DE BASES DE DATOS - LABORATORIO Página 6

También podría gustarte