Está en la página 1de 25

Base de Datos Nortwind

Resumen del desarrollo de la prctica.


Analizar la informacin almacenada en la base de datos NorthWind haciendo uso de las
distintas funciones de MS-SQL server.

Desarrollo de la prctica.
Comentarios En una lnea
USE northwind
SELECT unitprice,
(unitprice * 1.1), -- precio incrementado en 10%
productname
FROM products
GO

Comentarios En un bloque
/* Este cdigo devuelve todas las filas de la tabla products y muestra el precio por unidad, el
precio umentado en un 10 por ciento y el nombre del producto. */
USE northwind
SELECT unitprice, (unitprice * 1.1), productname
FROM products
GO

Variables
Sintaxis DECLARE {@variableLocal tipoDatos} [,...n] SET @nombreVariableLocal =
expresin
En este ejemplo se crean las variables locales @EmpID y @vlname, se asigna un valor a
@vlname y, a continuacin, se asigna un valor a @EmpID al consultar en la base de datos
NorthWind para seleccionar el registro que contiene el valor de la variable local @vlname.
USE northwind
DECLARE @EmpID varchar(11) ,@vlName char(20)
SET @vlname = 'Dodsworth'
SELECT @EmpID = employeeid FROM employees
WHERE LastName = @vlname
SELECT @EmpID AS EmployeeID

Funciones del sistema
Ejemplo 1
En este ejemplo se determina el promedio de la columna unitprice de todos los productos de
la tabla products.
USE northwind
SELECT AVG(unitprice) AS AvgPrice FROM products

Ejemplo 2
En este ejemplo de funcin de metadatos se devuelve el nombre de la base de datos que se
est utilizando actualmente.
USE northwind
SELECT DB_NAME() AS 'database'

Ejemplo 3
En este ejemplo se demuestra cmo puede convertir fechas a distintos estilos.
SELECT 'ANSI:', CONVERT (varchar(30), GETDATE(), 102) AS Style
UNION
SELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)
UNION
SELECT 'European:', CONVERT(varchar(30), GETDATE(), 113)

Ejemplo 4
En este ejemplo se utiliza la opcin DATEFORMAT de la instruccin SET para dar formato
a las fechas de la duracin de una conexin. Esta configuracin slo se utiliza en la
interpretacin de las cadenas de caracteres cuando se convierten a valores de fecha. No tiene
efecto al mostrar los valores de fecha.
SET DATEFORMAT dmy
DECLARE @vdate datetime SET @vdate = '29/11/98'
SELECT @vdate


Ejemplo 5
En el ejemplo siguiente se calcula el valor ampliado de un producto que forma parte de un
pedido; para ello se multiplica el precio unitario por la cantidad pedida y, a continuacin, se
filtran los resultados de forma que slo se devuelvan las filas correspondientes a pedidos con
un valor ampliado mayor de 10000.
SELECT OrderID, ProductID,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000

Ejemplo 6
En este ejemplo se determina si un cliente tiene algn pedido antes de eliminarlo de la lista
de clientes.
USE northwind
IF EXISTS (SELECT * FROM orders
WHERE customerid = 'frank')
PRINT '*** Customer cannot be deleted ***'
ELSE
BEGIN
DELETE customers WHERE customerid = 'frank' PRINT '*** Customer deleted ***'
END

Ejemplo 7
Ejecutar las siguientes consultas en el analizador de consulta y describir que hace cada una,
demostrar cmo afecta a los datos, es decir contrastar el antes y despus.







Nota: En el ejercicio 15 la funcin EXEC ejectala por separado, del bloque de consulta del
CREATE PROC porque es la forma de mandar a llamar a ese procedimiento que ya creaste.
El @ es el parmetro que espera ese procedimiento para ejecutar la consulta que lleva dentro.
El doble guin es la forma de comentar lneas en el Analizador de consultas.


Ejemplo 9
Ejecutar las siguientes consultas en el analizador de consulta y describir que hace cada una,
demostrar cmo afecta a los datos, es decir contrastar el antes y despus.

01. USE NORTHWIND
SELECT OrderID, Quantity As [Sin nombre de columna] FROM [Order Details]
WHERE OrderID BETWEEN 11000 AND 11002

02. SELECT OrderID, SUM (Quantity) As [Sin nombre de columna] FROM [Order
Details] WHERE OrderID BETWEEN 11000 AND 11002 GROUP BY OrderID

03. SELECT COUNT(*) FROM Employees

04. SELECT * FROM Employees

05. SELECT OrderID, AVG (Quantity) AS promedio FROM [Order Details] WHERE
OrderID BETWEEN 11000 AND 11002 GROUP BY OrderID

06. SELECT OrderID, MIN(Quantity) AS promedio FROM [Order Details] WHERE
OrderID BETWEEN 11000 AND 11002 GROUP BY OrderID

NOTA: En realidad todas las funciones de agregado ignoran los valores
NULL excepto COUNT (*).

07. SELECT OrderID, SUM(Quantity) AS TOTAL FROM [Order Details] GROUP
BY OrderID

08. SELECT OrderID, SUM(Quantity) AS TOTAL FROM [Order Details] GROUP
BY OrderID HAVING SUM(Quantity) > 300



Ejemplo 10
Realice el siguiente ejercicio.

--Creacin de BD
CREATE Database ventas
GO
USE ventas
GO
---tabla vendedor
CREATE TABLE VENDEDOR( idvendedor INT PRIMARY KEY , nombre VARCHAR(20),
apellido VARCHAR(10),
);
GO
---tabla ventas
CREATE TABLE VENTAS(
Idventa INT PRIMARY KEY , nombre VARCHAR(20), apellido VARCHAR(10), idvendedor INT
foreign key (idvendedor) references VENDEDOR(idvendedor))


Ejemplo 11
Realice los siguientes ejercicios sobre la Base de Datos Nortwind

-------------------------------------------------------------------------
--INSTRUCCIONES SELECT ELEMENTALES--
-------------------------------------------------------------------------
--1. Mostrar todas (*) las columnas de una tabla (from).
select * from dbo.Products

--2. Mostrar solo las columnas especificadas.
select ProductID, ProductName, UnitPrice, UnitsInStock from dbo.Products

--3. Incluir (ALL) filas duplicadas (valor predeterminado).
select all * from dbo.Products --
Es exactamente lo mismo que la instruccin 1.

--4. No incluir (DISTINCT) filas duplicadas.
select distinct * from dbo.Products

--5. Renombrar (AS) columnas.
select ProductID as Identificador, ProductName as [Nombre Producto], Unit
Price as [Precio Unidad],
UnitsInStock as UnidadesStock from dbo.Products

--6. Renombrar (AS) tablas.
select * from dbo.Products as Productos

-------------------------------------------------------------------------
--INSTRUCCIONES WHERE (Condiciones en Select)--
-------------------------------------------------------------------------
--
1. Condiciones con expresiones matemticas boleanas (>, <, =, >=, <=, !=
<>).
--(Mostrar solo los productos con un precio mayor que 25)
select * from dbo.Products
where UnitPrice > 25

--(Mostrar el nombre de los productos con precio igual a 21)
select ProductName as Nombre from dbo.Products
where UnitPrice = 21

--2. Condiciones de intervalos numricos (BETWEEN AND).
--(Mostrar los productos cuyo precio esta entre 25 y 35)
select * from Products
where UnitPrice between 25 and 35

--3. Condiciones de cadenas de caracteres (LIKE _ , %).
--
(Mostrar todos los datos de los clientes cuyo nombre comienza por A)
select * from Customers
where ContactName like 'A%' -
- El '%' significa cualquier cadena de caracteres.

--
(Mostrar los Paises que comienzan por U y despus un solo caracter).
select Country as Paises from Customers
where Country like 'U_' --El '_' significa cualquier caracter.

--
4. Mostrar solamente las filas con valores nulos (IS NULL) en una columna
determinada.
select * from dbo.Customers
where Region is null

--
5. Mostrar solamente las filas con valores no nulos (IS NOT NULL) en una
columna determinada.
select * from Customers
where Fax is not null

--6. Mostrar valores determinados (IN).
select * from Products
where UnitPrice in(10, 20, 30, 40)

--
7. Mostrar valores condicionalmente en funcin de un grupo de valores de
una columna (ANY/SOME)
--La clausula ANY es equivalente a SOME.
--Cuando tenemos una consulta que
devuelve un conjunto de resultados podemos necesitar compararlos
--
todos ellos y de una vez con otro valor. Lo mejor es ver un ejemplo de es
tas expresiones:

-- Condicin Expresin Equivalente
-- x > ANY (3, 5, 9) x > 3
-- x > ANY (1, 2) x > 1
-- x < ANY (1, 2) x < 2
-- x = ANY (1, 2) (x = 1) OR (x = 2)
-- x <> ANY (1, 2) (x <> 1) OR (x <> 2)

--
Mostrar los productos cuando su precio es mayor que los precios de los de
talles
--de pedidos, cuando la cantidad del pedido es 130.

select * from Products
where UnitPrice > ANY
(select UnitPrice from [Order Details] where Quantity = 130) -
- Esta consulta devuelve 18.00 y 35.25.

--
Por lo tanto solo se mostrarn productos cuyo precio sea mayor que 18.00,
incluido 35.25 si lo hubiera.


--
8. Con la clausula ALL podemos hacer lo mismo pero en este caso devolver
todos los productos
--
cuyo precio sea mayor que todos los precios de los detalles de pedidos de
130. Es decir, mayor que
--
todos los valores devueltos por la segunda consulta (18.00, 35.25), o lo
que es lo mismo,
--mayor que 35.25

select * from Products
where UnitPrice > ALL
(select UnitPrice from [Order Details] where Quantity = 130)

--9. Comprobar la existencia de un registro.

--
Mostrar los empleados cuya ciudad tambin exista en la tabla de empleados
.

select LastName, FirstName, City from Employees E
where exists
(select * from Customers C
where E.City = C.City)



-------------------------------------------------------------------------
--INTRUCCIONES ORDER BY (Ordenacin en Select)--
-------------------------------------------------------------------------
--1. Orden ascendente de filas.
--(Tabla Productos ordenada por el precio de menor a mayor).
select * from dbo.Products
order by UnitPrice asc

-- ASC es el valor predeterminado, se puede omitir.
select * from Products
order by UnitPrice

--2. Orden descendente de filas.
select * from Products
order by UnitsInStock desc

--3. Combinaciones de orden en distintas filas.
select ProductID, ProductName, UnitPrice, UnitsInStock from dbo.Products
order by UnitPrice, UnitsInStock desc

-------------------------------------------------------------------------
--SUBCONSULTAS EN SELECT O CONSULTAS ANIDADAS--
-------------------------------------------------------------------------
-
- Una subconsulta es una consulta SELECT dentro de un WHERE en una consul
ta previa SELECT. Es decir, realizamos
-
- dentro de una consulta, otra consulta para mostrar datos especificos de
la primera consulta. Ejemplos:

--
1. Mostrar todos los empleados que tengan el mismo sexo (TitleOfCourtesy)
que el empleado 9 (EmployeeID).
select * from dbo.Employees
where TitleOfCourtesy = (select TitleOfCourtesy from dbo.Employees
where EmployeeID = 9) --
Esta subconsulta devuelve 'Ms'.

--
2. Mostrar todos los productos de las categoras (bdo.Categories) bebidas
(Beverages) y condimentos (Condiments).
select * from dbo.Products
where CategoryID in (select CategoryID from dbo.Categories
where CategoryName in ('Beverages','Condiments')) --
Esta subconsulta devuelve 1 y 2.

-------------------------------------------------------------------------
--FUNCIONES DE AGREGACIN EN SELECT--
-------------------------------------------------------------------------
--1. Obtener el nmero de filas de una tabla --> COUNT(*).
select count(*) from dbo.Customers --
Se cuentan todos los valores, incluidos los NULL.

-- Se puede dar nombre a esta columna de la siguiente forma.
select count(*) as [Nmero de filas] from dbo.Customers

--2. Obtener el mmero de filas de una columna determinada --
> COUNT(NombreColumna).
select count(Region) as [NFilas no NULL]from dbo.Customers --
No se incluyen los valores NULL.

--3. Obtener nmero de filas para varias columnas determinadas.
select count(Region) as FilasNoNULL_Region, count(Fax) as FilasNoNULL_Fax
from dbo.Customers

--4. Obtener el valor mximo (MAX) y mnimo (MIN) de una columna.
select max(UnitPrice) as [Precio mximo], min(UnitsInStock) as [Stock mn
imo] from dbo.Products

--5. Obtener un sumatorio (SUM) de una columna determinada.
select sum(Freight) as [Peso Total] from dbo.Orders

--6. Obtener la media (AVG) de los valores de una columna determinada.
select avg(Freight) as [Peso Medio] from dbo.Orders


-------------------------------------------------------------------------
--
INSTRUCCIN GROUP BY (Agrupamiento de filas en funciones de agregacin)--
-------------------------------------------------------------------------
--
La instruccin GROUP BY permite especificar las columnas sobre las que se
quieren aplicar las funciones de
--
agregacin en lugar de hacerlo en una tabla completa. Es decir, muestra u
n resultado de la funcin de agregacin
--para cada elemento de la columna que especifiquemos. Ejemplos:

--1. Mostrar cuantas veces se repite cada precio de los productos.
select UnitPrice, count(*) as [Filas con este precio] from Products
group by UnitPrice

--2. Mostrar nmero de clientes de cada region y ciudad de USA.
select Region, City, count(*) as [N Clientes] from Customers
where Country = 'USA'
group by Region, City
order by [N Clientes] desc

--
NOTA 1: Siempre debe especificarse las mismas columnas en SELECT que en G
ROUP BY.
--
NOTA 2: Es una buena prctica ordenar (ORDER BY) los elementos cuando se
realizan este tipo de consultas.

-------------------------------------------------------------------------
--INSTRUCCIN HAVING (Condiciones en los resultados de GROUP BY)--
-------------------------------------------------------------------------
--
La instruccin HAVING es similar a WHERE pero para agrupamientos de funci
ones de agregacin. Ejemplo:

--
1. Mostrar lo mismo que el ejercicio 1 de la seccin anterior, con precio
s mayor que 10 y repiticiones mayor que 2.
select UnitPrice, count(*) as [Filas con este precio] from Products
where UnitPrice > 10
group by UnitPrice
having count(*) > 2

-------------------------------------------------------------------------
Ejemplo 12
Realice el siguiente ejercicio

use Northwind
go

if exists (select * from sys.tables where name = 'varchar_variable_dcha')
drop table dbo.varchar_variable_dcha
go

CREATE TABLE [dbo].varchar_variable_dcha(
id bigint identity primary key,
c varchar(200) NULL
)
go

declare @i int
set @i = 1
while @i<=10 -- 1.000.000 filas
begin
INSERT INTO dbo.varchar_variable_dcha
SELECT top (100000)
replace(cast(NEWID() as varchar(100)), '-','')
+ REPLICATE('a', 200-32)
FROM [Northwind].[dbo].[Orders]
CROSS JOIN [Northwind].[dbo].[Order Details]

print cast (@i as varchar(100))
set @i=@i+1
end
go

select top(10) * from dbo.varchar_variable_dcha
go
Ejemplo 13
En este ejercicio se debe escribir sentencias SQL. Cada declaracin slo utilizar una sola tabla. Pasar
por correo al profesor todas las sentecias.
1. Una lista de todos los detalles de la tabla de empleados.
2. Una lista de los nombres y apellidos de todos los empleados.
3. Una lista de todos los nombres de las ciudades que aparecen en la tabla de empleados. No
mostrar 2 veces un mismo nombre de ciudad.
4. Una lista de los nombres de productos y precios unitarios.
5. En la tabla de empleados: una lista de los detalles completos de los empleados que viven en
EE.UU.
6. A partir de la tabla Pedidos, listar todos los pedidos que tienen un gasto de envio > 50.
7. De la tabla de clientes: listar nombre de la empresa de todos los clientes donde el cargo es
igual a Propietario.
8. A partir de los clientes una lista de todos donde el nombre del cliente comienza con la letra
"A.
9. Una lista de los nombres de clientes donde la regin no est en blanco.
10. Una lista de todos los productos, ordenado por precio unitario (el ms barato primero).
11. Una lista de todos los productos, ordenado por precio unitario (el ms caro primero).
12. El nmero total de empleados. Nombre de la columna de salida "TotalEmpleados".
13. De la tabla de Pedidos, el pedido con el menor gasto de envi, el gasto de envi promedio y el
mximo gasto de envi (puede estar separado en 3 consultas distintas).
14. Utilizando la tabla de clientes una lista de los nombres de ciudades y el nmero de clientes en
cada ciudad.
15. Utilizando la tabla de clientes una lista de los nombres de ciudades y el nmero de clientes en
cada ciudad. Solo las ciudades con al menos 2 clientes deben aparecer en la lista.
16. Insertar el cliente nuevo completando todos los campos de la tabla.
17. Actualizar el nombre del nuevo cliente pasando nmero de ID obtenido en el punto 16.
18. Eliminar el cliente insertado en el punto 16.

Procedimientos para agrupar y resumir datos 1


Prctica A: Procedimientos para agrupar y resumir datos
Objetivos
Despus de realizar esta prctica, el alumno ser capaz de:
Utilizar las clusulas GROUP BY y HAVING para resumir datos por
grupos.
Utilizar los operadores ROLLUP y CUBE, y la funcin GROUPING para
generar datos de resumen.
Utilizar las clusulas COMPUTE y COMPUTE BY para generar informes
con secciones, totales y promedios.

Requisitos previos
El archivo lab052.zip contiene los archivos de comandos necesarios para la
realizacin de la prctica, as como las correspondientes soluciones.
Ejercicio 1
Uso de la palabra clave TOP n
En este ejercicio, va a utilizar la palabra clave TOP n y la clusula WITH TIES
para obtener las primeras filas, o un porcentaje de ellas, de un conjunto de
resultados. La carpeta Soluciones contiene las secuencias de comandos
completas para este ejercicio.
Para utilizar la palabra clave TOP n y presentar las primeras filas de
un conjunto de resultados
En este procedimiento, debe modificar una secuencia de comandos para que
devuelva las diez primeras filas de una consulta. La secuencia de comandos
completa para este procedimiento es Answer_TopN1.sql.

Abra el Analizador de consultas de SQL Server y, si as se le pide, inicie una
sesin en el servidor local con autenticacin de Microsoft Windows.
En la lista BD, haga clic en northwind.
Abra y examine la secuencia de comandos TopN.sql, que corresponde a una
consulta que calcula el importe total de las ventas de cada pedido de la tabla
order details y devuelve los resultados en orden decreciente.
Modifique la consulta descrita en el paso 4 para que slo devuelva las diez
primeras filas.
USE northwind
SELECT TOP 10
orderid
,(unitprice * quantity) AS totalsale
FROM [order details]
ORDER BY (unitprice * quantity) DESC
GO
Ejecute la consulta para comprobar que slo devuelve diez filas.
Su resultado ser similar al siguiente conjunto de resultados. Resultado
2 Procedimientos para agrupar y resumir datos


orderid totalsale
10865 15810.0000
10981 15810.0000
10353 10540.0000
10417 10540.0000
10889 10540.0000
10424 10329.2000
10897 9903.2000
10372 8432.0000
10540 7905.0000
10816 7905.0000

(10 filas afectadas)

Para presentar los primeros valores de un conjunto de resultados
usando la palabra clave TOP n
En este procedimiento va a utilizar la palabra clave TOP n para presentar los
primeros valores de un conjunto de resultados. La secuencia de comandos
completa para este procedimiento es Answer_TopN2.sql.
Modifique la consulta descrita en el paso 5 del procedimiento anterior para que
devuelva los diez primeros productos (incluidos los valores iguales) que
tengan el mayor importe total.
USE northwind
SELECT TOP 10 WITH TIES
orderid
,(unitprice * quantity) AS totalsale
FROM [order details]
ORDER BY (unitprice * quantity) DESC
GO
Ejecute la consulta para comprobar que devuelve once filas.
Procedimientos para agrupar y resumir datos 3


Su resultado ser similar al siguiente conjunto de resultados.
orderid totalsale

10865 15810.0000
10981 15810.0000
10353 10540.0000
10417 10540.0000
10889 10540.0000
10424 10329.2000
10897 9903.2000
10372 8432.0000
10540 7905.0000
10816 7905.0000
10817 7905.0000

(11 filas afectadas)



Resultado
4 Procedimientos para agrupar y resumir datos


Ejercicio 2
Uso de las clusulas GROUP BY y HAVING
En este ejercicio, va a utilizar las clusulas GROUP BY y HAVING
para resumir datos de la base de datos Northwind. La carpeta Soluciones
contiene las secuencias de comandos completas para este ejercicio.
Para utilizar la clusula GROUP BY para resumir los datos
En este procedimiento va a abrir una secuencia de comandos que contiene una
consulta con la clusula GROUP BY. A continuacin, modificar la consulta
para obtener resultados diferentes.
Abra y examine la secuencia de comandos Groupby.sql. Se trata de una
consulta que calcula la cantidad total de artculos pedidos de dos categoras
distintas de artculos de la tabla order details.
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados.
categoryid total_quantity
1 9532
2 5298

(2 filas afectadas)

Para calcular la cantidad total para cada una de las categoras
Answer_Groupby1.sql es la secuencia de comandos completa de este
procedimiento.
Modifique la secuencia de comandos descrita en el paso 1 del procedimiento
anterior para resumir la cantidad por categora para todos los productos, sea
cual sea su categora.
USE northwind
SELECT categoryid, SUM(quantity) AS total_quantity
FROM [order details] AS od
INNER JOIN products AS p
ON od.productid = p.productid
GROUP BY categoryid
GO
Ejecute la consulta para revisar los resultados.

Resultado
Procedimientos para agrupar y resumir datos 5


Su resultado ser similar al siguiente conjunto de resultados.
categoryid total_quantity

1h 9532
2 5298
3 7906
4 9149
5 4562
6 4199
7 2990
8 7681

(8 filas afectadas)

Para calcular la cantidad total para cada pedido
En este procedimiento calcular la cantidad total para cada pedido.
Answer_Groupby2.sql es la secuencia de comandos completa de este
procedimiento.
Modifique la secuencia de comandos descrita en el paso 1 del procedimiento
anterior para resumir la cantidad por orderid (pedido) para todos los
productos, sea cual sea su categora.
USE northwind
SELECT orderid, SUM(quantity) AS total_quantity
FROM [order details] AS od
INNER JOIN products AS p
ON od.productid = p.productid
GROUP BY orderid
GO
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados parciales.
orderid total_quantity
10248 27
10249 49
10250 60
.
.
.
11075 42
11076 50
11077 72

(830 filas afectadas)

Resultado
Resultado
6 Procedimientos para agrupar y resumir datos


Para calcular el nmero de pedidos con ms de 250 unidades pedidas
En este procedimiento calcular el nmero de pedidos con ms de 250 unidades
pedidas. Answer_Groupby3.sql es la secuencia de comandos completa de este
procedimiento.
Modifique la secuencia de comandos descrita en el paso 1 del procedimiento
anterior para resumir la cantidad por orderid (pedido) para todos los
productos, sea cual sea su categora, y devolver slo los pedidos que tengan
ms de 250 unidades pedidas
USE northwind
SELECT orderid, SUM(quantity) AS total_quantity
FROM [order details] AS od
INNER JOIN products AS p
ON od.productid = p.productid
GROUP BY orderid
HAVING SUM(quantity) > 250
GO
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados.
orderid total_quantity
10515 286
10612 263
10658 255
10678 280
10847 288
10895 346
10990 256
11030 330

(8 filas afectadas)

Resultado
Procedimientos para agrupar y resumir datos 7


Ejercicio 3
Uso de los operadores ROLLUP y CUBE
En este ejercicio, va a utilizar los operadores ROLLUP y CUBE para generar
datos de resumen. Tambin va a utilizar la funcin GROUPING para
determinar las filas del resultado que son resmenes. La carpeta Soluciones
contiene las secuencias de comandos completas para este ejercicio.
Para utilizar el operador ROLLUP con el fin de generar resultados de
resumen
En este procedimiento va a utilizar el operador ROLLUP con las clusulas
GROUP BY y HAVING para generar resultados de resumen. La secuencia de
comandos completa para este procedimiento es Answer_Rollup1.sql.
Abra y examine la secuencia de comandos Answer_Rollup1.sql. Se trata de una
consulta que resume la cantidad de artculos pedidos por cada productid y
ordered, y realiza un clculo acumulativo.
Modifique la consulta descrita en el paso 1 para que en el resultado slo
aparezca el nmero de producto 50, con una clusula WHERE, y despus
ejecute la consulta.
USE northwind
SELECT productid, orderid, SUM(quantity) AS total_quantity
FROM [order details]
WHERE productid = 50
GROUP BY productid, orderid
WITH ROLLUP
ORDER BY productid, orderid
GO
Ejecute la consulta para revisar los resultados. Cuente las filas que tienen
valores nulos.

Su resultado ser similar al siguiente conjunto de resultados.
productid orderid total_quantity

NULL NULL 235
50 NULL 235
50 10350 15
50 10383 15
50 10429 40
50 10465 25
50 10637 25
50 10729 40
50 10751 20
50 10920 24
50 10948 9
50 11072 22

(12 filas afectadas)

Resultado
8 Procedimientos para agrupar y resumir datos


4. Qu significan los valores nulos en las columnas productid y orderid?
Los valores nulos en una fila indican que el valor que aparece en la
columna total_quantity de esa fila es la suma de todos los valores
total_quantity sin agrupar en la columna que tiene el valor nulo.
Por ejemplo, el valor total_quantity en la fila en que productid y
orderid tienen valor nulo es la suma de todos los valores total_quantity
de la tabla.
_____________________________________________________________
_____________________________________________________________

Para utilizar el operador CUBE con el fin de generar resultados de
resumen
En este procedimiento va a usar el operador CUBE y la funcin GROUPING
para diferenciar entre las filas de resumen y detalles del conjunto de resultados.
La secuencia de comandos completa para este procedimiento es
Answer_Cube1.sql.
Abra y examine la secuencia de comandos Answer_Rollup1.sql. Se trata de una
consulta que resume la cantidad de artculos pedidos por cada productid y
ordered, y realiza un clculo acumulativo.
Modifique la consulta descrita en el paso 1 para usar el operador CUBE en
lugar del operador ROLLUP. Adems, utilice la funcin GROUPING en las
columnas productid y orderid para distinguir filas de resumen y filas de
detalle dentro del conjunto de resultados, y, despus, ejecute la consulta.
USE northwind
SELECT productid
,GROUPING(productid)
,orderid
,GROUPING(orderid)
,SUM(quantity) AS total_quantity
FROM [order details]
WHERE productid = 50
GROUP BY productid, orderid
WITH CUBE
ORDER BY productid, orderid
GO
Ejecute la consulta para revisar los resultados.
Procedimientos para agrupar y resumir datos 9


Su resultado ser similar al siguiente conjunto de resultados.
productid orderid total_quantity

NULL 1 NULL 1 235
NULL 1 10350 0 15
NULL 1 10383 0 15
NULL 1 10429 0 40
NULL 1 10465 0 25
NULL 1 10637 0 25
NULL 1 10729 0 40
NULL 1 10751 0 20
NULL 1 10920 0 24
NULL 1 10948 0 9
NULL 1 11072 0 22
50 0 NULL 1 235
50 0 10350 0 15
50 0 10383 0 15
50 0 10429 0 40
50 0 10465 0 25
50 0 10637 0 25
50 0 10729 0 40
50 0 10751 0 20
50 0 10920 0 24
50 0 10948 0 9
50 0 11072 0 22

(22 filas afectadas)

Qu filas son de resumen?
Las filas que tienen el nmero 1 en las columnas de la funcin
GROUPING.
____________________________________________________________
____________________________________________________________
Qu filas son el resumen por producto? Y por pedido?
Si el nmero 1 est presente en la columna generada por la funcin
GROUPING para la columna productid, la fila es un resumen por
pedido. La columna productid de dicha fila es NULL porque es un
resumen, no una fila de detalle que contiene un valor NULL. La fila que
tiene un nmero 1 en la columna GROUPING es un resumen para el
producto nmero 50. La fila que tiene un nmero 1 en las dos columnas
GROUPING es un total global.
____________________________________________________________
____________________________________________________________

Resultado
10 Procedimientos para agrupar y resumir datos


Ejercicio 4
Uso de las clusulas COMPUTE y COMPUTE BY
En este ejercicio va a utilizar las clusulas COMPUTE y COMPUTE BY para
generar informes con secciones y totales, y promedios finales.
La carpeta Soluciones contiene las secuencias de comandos completas para este
ejercicio.
Para utilizar la clusula COMPUTE con el fin de generar informes
En este procedimiento va a modificar una consulta existente al agregar las
clusulas COMPUTE y COMPUTE BY para generar subtotales y totales
finales. Answer_Compute1.sql es la secuencia de comandos completa de este
procedimiento.
Abra y examine la secuencia de comandos Answer_Compute1.sql. Se trata de
una consulta que devuelve el nmero de pedido (orderid) y la cantidad
(quantity) pedida para todos los pedidos cuyo orderid >11070.
Modifique la consulta descrita en el paso 1 para generar un total final de la
columna cantidad (quantity) mediante el uso de la clusula COMPUTE.
USE northwind
SELECT orderid, quantity
FROM [order details]
WHERE orderid >= 11070
COMPUTE SUM(quantity)
GO
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados parciales.
orderid quantity
11070 40
11070 20
11070 30
.
.
.
11077 24
11077 4
11077 1

Sum
==========
543

(45 filas afectadas)

Resultado
Procedimientos para agrupar y resumir datos 11


Para utilizar la clusula COMPUTE BY con el fin de generar informes
En este procedimiento, va a modificar una consulta existente. Para ello,
agregar la clusula COMPUTE BY con el fin de generar totales finales.
Answer_Compute2.sql es la secuencia de comandos completa de este
procedimiento.
Abra y examine la secuencia de comandos Answer_Compute2.sql. Se trata de
una consulta que devuelve el nmero de pedido (orderid) y la cantidad
(quantity) pedida para todos los pedidos cuyo orderid >11070.
Modifique la consulta descrita en el paso 1 para generar un informe con
secciones que proporcione la cantidad total de los pedidos 11075 y 11076.
USE northwind
SELECT orderid, quantity
FROM [order details]
WHERE orderid in ( 11075, 11076 )
ORDER BY orderid
COMPUTE SUM(quantity) BY orderid
GO
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados.
orderid quantity
11075 10
11075 30
11075 2
Sum
==========
42

11076 20
11076 20
11076 10
Sum
==========
50

(8 filas afectadas)

Resultado
12 Procedimientos para agrupar y resumir datos


Para agregar la cantidad total y cantidad promedio al final del informe
con secciones
En este procedimiento va a agregar la cantidad total y cantidad promedio al
final del informe con secciones. Answer_Compute3.sql es la secuencia de
comandos completa de este procedimiento.
Modifique la consulta descrita en el paso 1 del procedimiento anterior para
agregar la cantidad total y cantidad promedio al final del informe con
secciones.
USE northwind
SELECT orderid, quantity
FROM [order details]
WHERE orderid in ( 11075, 11076 )
ORDER BY orderid
COMPUTE SUM(quantity) BY orderid
COMPUTE SUM(quantity)
COMPUTE AVG(quantity)
GO
Ejecute la consulta para revisar los resultados.

Su resultado ser similar al siguiente conjunto de resultados. Observe que este
conjunto de resultados es similar al del paso 3 del procedimiento anterior, con
la adicin de los totales finales (cantidad total y cantidad promedio).
orderid quantity

11075 10
11075 30
11075 2
Sum
==========
42

11076 20
11076 20
11076 10
Sum
==========
50

Sum
==========
92

Avg
==========
15

(10 filas afectadas)

Resultado