Está en la página 1de 25

Base de Datos Nortwind

Resumen del desarrollo de la práctica.


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

Desarrollo de la práctica.
Comentarios En una línea
USE northwind
SELECT unitprice,
(unitprice * 1.1), -- precio incrementado en 10%
productname
FROM products
GO

Comentarios En un bloque
/* Este código 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 =
expresión
En este ejemplo se crean las variables locales @EmpID y @vlname, se asigna un valor a
@vlname y, a continuación, 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 función 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 cómo 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 opción DATEFORMAT de la instrucción SET para dar formato
a las fechas de la duración de una conexión. Esta configuración sólo se utiliza en la
interpretación 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 continuación, se
filtran los resultados de forma que sólo 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 algún 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 cómo afecta a los datos, es decir contrastar el antes y después.
Nota: En el ejercicio 15 la función EXEC ejecútala 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 parámetro que espera ese procedimiento para ejecutar la consulta que lleva dentro.
El doble guión es la forma de comentar líneas en el Analizador de consultas.
Ejemplo 9
Ejecutar las siguientes consultas en el analizador de consulta y describir que hace cada una,
demostrar cómo afecta a los datos, es decir contrastar el antes y después.

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.

--Creación 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 instrucción 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 matemáticas 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 numéricos (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 después 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 función 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:

-- Condición Expresión 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 mostrarán 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 también 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 (Ordenación 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 categorías (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 AGREGACIÓN EN SELECT--
-------------------------------------------------------------------------
--1. Obtener el número 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 [Número de filas] from dbo.Customers

--2. Obtener el múmero de filas de una columna determinada --


> COUNT(NombreColumna).
select count(Region) as [NºFilas no NULL]from dbo.Customers --
No se incluyen los valores NULL.

--3. Obtener número de filas para varias columnas determinadas.


select count(Region) as FilasNoNULL_Region, count(Fax) as FilasNoNULL_Fax
from dbo.Customers

--4. Obtener el valor máximo (MAX) y mínimo (MIN) de una columna.


select max(UnitPrice) as [Precio máximo], min(UnitsInStock) as [Stock mín
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

-------------------------------------------------------------------------
--
INSTRUCCIÓN GROUP BY (Agrupamiento de filas en funciones de agregación)--
-------------------------------------------------------------------------
--
La instrucción GROUP BY permite especificar las columnas sobre las que se
quieren aplicar las funciones de
--
agregación en lugar de hacerlo en una tabla completa. Es decir, muestra u
n resultado de la función de agregación
--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 número 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 práctica ordenar (ORDER BY) los elementos cuando se
realizan este tipo de consultas.

-------------------------------------------------------------------------
--INSTRUCCIÓN HAVING (Condiciones en los resultados de GROUP BY)--
-------------------------------------------------------------------------
--
La instrucción HAVING es similar a WHERE pero para agrupamientos de funci
ones de agregación. Ejemplo:

--
1. Mostrar lo mismo que el ejercicio 1 de la sección 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 declaración sólo 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 región no está en blanco.
10. Una lista de todos los productos, ordenado por precio unitario (el más barato primero).
11. Una lista de todos los productos, ordenado por precio unitario (el más caro primero).
12. El número 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
máximo 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 número de clientes en
cada ciudad.
15. Utilizando la tabla de clientes una lista de los nombres de ciudades y el número 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 número de ID obtenido en el punto 16.
18. Eliminar el cliente insertado en el punto 16.
Procedimientos para agrupar y resumir datos 1

Práctica A: Procedimientos para agrupar y resumir datos


Objetivos
Después de realizar esta práctica, el alumno será capaz de:
„ Utilizar las cláusulas GROUP BY y HAVING para resumir datos por
grupos.
„ Utilizar los operadores ROLLUP y CUBE, y la función GROUPING para
generar datos de resumen.
„ Utilizar las cláusulas 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
realización de la práctica, 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 cláusula 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


sesión en el servidor local con autenticación 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 sólo 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 sólo devuelve diez filas.
Resultado Su resultado será similar al siguiente conjunto de resultados.
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

Resultado 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)


4 Procedimientos para agrupar y resumir datos

Ejercicio 2
Uso de las cláusulas GROUP BY y HAVING
En este ejercicio, va a utilizar las cláusulas 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 cláusula GROUP BY para resumir los datos


En este procedimiento va a abrir una secuencia de comandos que contiene una
consulta con la cláusula GROUP BY. A continuación, 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 artículos pedidos de dos categorías
distintas de artículos de la tabla order details.
Ejecute la consulta para revisar los resultados.

Resultado 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 categorías


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 categoría para todos los productos, sea
cual sea su categoría.
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.
Procedimientos para agrupar y resumir datos 5

Resultado 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 categoría.
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.

Resultado 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)


6 Procedimientos para agrupar y resumir datos

Ë Para calcular el número de pedidos con más de 250 unidades pedidas


En este procedimiento calculará el número de pedidos con más 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 categoría, y devolver sólo los pedidos que tengan
más 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.

Resultado 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)
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. También va a utilizar la función GROUPING para
determinar las filas del resultado que son resúmenes. 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 cláusulas
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 artículos pedidos por cada productid y
ordered, y realiza un cálculo acumulativo.
Modifique la consulta descrita en el paso 1 para que en el resultado sólo
aparezca el número de producto 50, con una cláusula WHERE, y después
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.

Resultado 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)


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 función 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 artículos pedidos por cada productid y
ordered, y realiza un cálculo acumulativo.
Modifique la consulta descrita en el paso 1 para usar el operador CUBE en
lugar del operador ROLLUP. Además, utilice la función GROUPING en las
columnas productid y orderid para distinguir filas de resumen y filas de
detalle dentro del conjunto de resultados, y, después, 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

Resultado 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 número 1 en las columnas de la función
GROUPING.
____________________________________________________________

____________________________________________________________

¿Qué filas son el resumen por producto? ¿Y por pedido?


Si el número 1 está presente en la columna generada por la función
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 número 1 en la columna GROUPING es un resumen para el
producto número 50. La fila que tiene un número 1 en las dos columnas
GROUPING es un total global.
____________________________________________________________

____________________________________________________________
10 Procedimientos para agrupar y resumir datos

Ejercicio 4
Uso de las cláusulas COMPUTE y COMPUTE BY
En este ejercicio va a utilizar las cláusulas 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 cláusula COMPUTE con el fin de generar informes


En este procedimiento va a modificar una consulta existente al agregar las
cláusulas 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 número 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 cláusula COMPUTE.
USE northwind
SELECT orderid, quantity
FROM [order details]
WHERE orderid >= 11070
COMPUTE SUM(quantity)
GO
Ejecute la consulta para revisar los resultados.

Resultado 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)


Procedimientos para agrupar y resumir datos 11

Ë Para utilizar la cláusula COMPUTE BY con el fin de generar informes


En este procedimiento, va a modificar una consulta existente. Para ello,
agregará la cláusula 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 número 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.

Resultado 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)
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.

Resultado 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 adición 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)

También podría gustarte