Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROCEDIMIENTOS ALMACENADOS
--listar todos los títulos y su correspondiente autor
COMMIT TRANSACTION
END
RETURN
END
RETURN
END
--Obtener los autores que han vendido más de 100,000 dólares en un año
CREATE FUNCTION autoresMasVendedoresPorAnio(@anio INT)
RETURNS @resultados TABLE (
au_id VARCHAR(11),
au_nombre VARCHAR(40),
au_apellido VARCHAR(40),
ventas_totales FLOAT
)
AS
BEGIN
INSERT INTO @resultados
SELECT TOP 5 authors.au_id, authors.au_fname, authors.au_lname, SUM(sales.qty *
titles.price)
FROM authors
JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
JOIN sales ON titles.title_id = sales.title_id
WHERE YEAR(sales.ord_date) = @anio
GROUP BY authors.au_id, authors.au_fname, authors.au_lname
HAVING SUM(sales.qty * titles.price) > 100000
ORDER BY SUM(sales.qty * titles.price) DESC
RETURN
END
RETURN
END
RETURN
END
--consultas que utilizan un trigger en la base de datos pubs
--Registrar cambios en la tabla "sales" en otra tabla "sales_hisoty"
--Este trigger verifica que los valores de la columna "price" en la tabla "titles"
sean mayores a 0 durante una inserción o actualización. Si un valor menor o igual a
0 es detectado, la transacción es revertida y se muestra un mensaje de error.
--4 RESTRINGIR LA ELIMINACIÓN DE UN AUTOR QUE TENGA TÍTULOS ASOCIADOS
-- EN LA TABLA "TITLEAUTHOR"
CREATE TRIGGER tr_restringir_eliminar_autor ON authors
INSTEAD OF DELETE
AS
BEGIN
IF EXISTS(SELECT * FROM deleted d JOIN titleauthor ta ON d.au_id = ta.au_id)
BEGIN
RAISERROR ('No se puede eliminar un autor que tiene títulos asociados.', 16,
1)
ROLLBACK TRANSACTION
END
ELSE
BEGIN
DELETE FROM authors WHERE au_id IN (SELECT au_id FROM deleted)
END
END
--Este trigger restringe la eliminación de un autor que tenga títulos asociados en
la tabla "titleauthor". Si se encuentra algún título asociado al autor a eliminar,
se muestra un mensaje de error y se revierte la transacción. Si no hay títulos
asociados, se permite la eliminación del autor
--5 ACTUALIZAR LA CANTIDAD DE TÍTULOS EN LA TABLA "PUBLISHERS" CUANDO SE INSERTA O
ELIMINA UNA FILA EN LA TABLA "TITLES"
CREATE TRIGGER tr_actualizar_cant_titulos ON titles
AFTER INSERT, DELETE
AS
BEGIN
UPDATE publishers
SET pub_info = REPLACE(pub_info, 'Cantidad de títulos: ' + CAST((SELECT COUNT(*)
FROM titles WHERE pub_id = publishers.pub_id) AS varchar), 'Cantidad de títulos: ' +
CAST((SELECT COUNT(*) FROM inserted WHERE pub_id = publishers.pub_id) AS varchar))
FROM publishers
JOIN inserted ON inserted.pub_id = publishers.pub_id OR deleted.pub_id =
publishers.pub_id
END
--CONSULTAS UTILIZANDO EL CURSOR EN LA BASE DE DATOS PUBS
--1 OBTENER EL NÚMERO TOTAL DE VENTAS DE CADA LIBRO EN LA TABLA "SALES" Y MOSTRAR EL
RESULTADO
--EN UN TABLA
DECLARE @title_id VARCHAR(20), @qty INT, @total_sales MONEY
OPEN cur_sales
WHILE @@FETCH_STATUS = 0
BEGIN
SET @total_sales = @qty * (SELECT price FROM titles WHERE title_id = @title_id)
IF EXISTS (SELECT * FROM #sales_summary WHERE title_id = @title_id)
BEGIN
UPDATE #sales_summary SET total_sales = total_sales + @total_sales WHERE
title_id = @title_id
END
ELSE
BEGIN
INSERT INTO #sales_summary (title_id, total_sales) VALUES (@title_id,
@total_sales)
END
FETCH NEXT FROM cur_sales INTO @title_id, @qty
END
CLOSE cur_sales
DEALLOCATE cur_sales
--Este código utiliza un cursor para recorrer la tabla "sales" y calcular el número
total de ventas de cada libro multiplicando la cantidad vendida por el precio de
cada libro. Los resultados se almacenan en una tabla temporal llamada
"#sales_summary" y se muestran al final
--2 OBTENER EL NÚMERO DE AUTORES DE CADA EDITORIAL EN LA TABLA "PUBLISHER" Y MOSTRAR
EL RESULTADO EN UN TABLA
DECLARE @pub_id VARCHAR(4), @au_id VARCHAR(11)
OPEN cur_authors
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT * FROM #authors_summary WHERE pub_id = @pub_id)
BEGIN
UPDATE #authors_summary SET num_authors = num_authors + 1 WHERE pub_id =
@pub_id
END
ELSE
BEGIN
INSERT INTO #authors_summary (pub_id, num_authors) VALUES (@pub_id, 1)
END
FETCH NEXT FROM cur_authors INTO @pub_id, @au_id
END
CLOSE cur_authors
DEALLOCATE cur_authors
--Este cursor recorre la tabla "titles" y muestra los títulos y sus precios
utilizando un bucle WHILE y la función PRINT.
--4 UTILIZAR UN CURSOR PARA ACTUALIZAR EL PRECIO DE LOS TITULOS DE LA EDITORIAL "NEW
MOON BOOKS" EN UN 10%
DECLARE @title_id varchar(20), @price money
DECLARE cur_titles CURSOR FOR
SELECT title_id, price FROM titles WHERE pub_id = '0877'
OPEN cur_titles
FETCH NEXT FROM cur_titles INTO @title_id, @price
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE titles SET price = @price * 1.1 WHERE title_id = @title_id
FETCH NEXT FROM cur_titles INTO @title_id, @price
END
CLOSE cur_titles
DEALLOCATE cur_titles
--Este cursor recorre la tabla "titles" y actualiza el precio de los títulos de la
editorial "New Moon Books" en un 10% utilizando un bucle WHILE y la sentencia
UPDATE.
--5 UTILIZAR UN CURSOR PARA CALCULAR EL TOTAL DE VENTAS DE CADA AUTOR Y MOSTRARLOS
EN ORDEN DESCENDENTE
DECLARE @au_id varchar(20), @total_sales money
DECLARE cur_sales CURSOR FOR
SELECT au_id, SUM(qty * price) AS total_sales FROM sales JOIN titleauthor ON
sales.title_id = titleauthor.title_id GROUP BY au_id
OPEN cur_sales
FETCH NEXT FROM cur_sales INTO @au_id, @total_sales
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Autor: ' + @au_id + ', Total de ventas: ' + CAST(@total_sales AS varchar)
FETCH NEXT FROM cur_sales INTO @au_id, @total_sales
END
CLOSE cur_sales
DEALLOCATE cur_sales
---Este cursor utiliza una consulta que une las tablas "sales" y "titleauthor" para
calcular el total de ventas de cada autor y mostrarlos en orden descendente
utilizando un bucle WHILE y la función PRINT.