Procedure: Problema 3 y Problema 4 Luis
DESCRIPCION:
3) Para un rango de fechas, Los 5 eventos que han atraido la mayor cantidad de asistentes.
Entradas: fecha inicio, fecha fin
Salidas: Los 5 eventos, en orden descendente de cantidad de asistentes.
Para cada evento mostrar: Nombre del evento, fecha inicio, fecha fin, cantidad de asistentes.
4) Los 10 asientos preferidos para eventos tipo Opera, en un rango de fechas.
Entradas: fecha inicio, fecha fin Salidas: Numero de asiento, cantidad de veces comprado. En orden
descesdente de la cantidad de veces.
PROBLEMAS:
Error: Msg 8120
No era posible poner todos los atributos requeridos debido que al aplicar una función count, avg o sum Sql server no lo permitía, por lo que se debió usar tablas variables.
Error: Msg 147
Usar where cuando lo que debía usarse having, esto sucedió en diversas ocasiones
CODIGO:
-----------------------------------------------------------------------------------------------------------------------
-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_CANTIDAD_ASISTENTES_EVENTO', N'P' ) IS NOT NULL
DROP PROCEDURE BT_SP_CANTIDAD_ASISTENTES_EVENTO;
GO
/*
3) Para un rango de fechas, Los 5 eventos que han atraido la mayor cantidad de asistentes.
Entradas: fecha inicio, fecha fin
Salidas: Los 5 eventos, en orden descendente de canditad de asistentes.
Para cada evento mostrar: Nombre del evento, fecha inicio, fecha fin, cantidad de asistentes.
*/
CREATE PROCEDURE BT_SP_CANTIDAD_ASISTENTES_EVENTO
@FechaInicio datetime,
@FechaFin datetime
AS
BEGIN
BEGIN TRY
Declare @temporal Table(NombreEvento varchar(150), IDTiquete int );
Declare @CantidadXEvento Table (Nombre varchar(150), Id int);
BEGIN TRANSACTION
Insert into @temporal(NombreEvento,IDTiquete)
(SELECT BT_Evento.Nombre, BT_Tiquete.Id
from BT_Tiquete
inner join BT_AsientoXTanda on BT_Tiquete.FK_AsientoXTanda = BT_AsientoXTanda.Id
inner join BT_Tanda on BT_AsientoXTanda.FK_Tanda = BT_Tanda.Id
inner join BT_Evento on BT_Tanda.FK_Evento = BT_Evento.Id
where FechaHora between @FechaInicio and @FechaFin)
insert into @CantidadXEvento(Nombre,Id)
select NombreEvento,count(distinct IDTiquete) as Cantidad from @temporal
group by NombreEvento --order by Cantidad desc
select top 5 Nombre,Id from @CantidadXEvento order by ID
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN 1;
END TRY
BEGIN CATCH
EXEC BT_SP_GetErrorInfo;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
RETURN @@ERROR*-1;
END CATCH
END
GO
--EXEC BT_SP_CANTIDAD_ASISTENTES_EVENTO '2014-11-21 00:00:00.000', '2015-07-13 00:00:00.000'
----------------------------------------------------------------------------------------------------------------------
-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASIENTOS_PREFE_OPERA', N'P' ) IS NOT NULL
DROP PROCEDURE BT_SP_ASIENTOS_PREFE_OPERA;
GO
/*
4) Los 10 asientos preferidos para eventos tipo Opera, en un rango de fechas.
Entradas: fecha inicio, fecha fin
Salidas: Numero de asiento, cantidad de veces comprado. En orden
descesdente de la cantidad de veces.
*/
CREATE PROCEDURE BT_SP_ASIENTOS_PREFE_OPERA
@FechaIni datetime,
@FechaFin datetime
AS
BEGIN
BEGIN TRY
DECLARE @TableA TABLE(
Id_Tiquete int,
FK_Asiento int,
FK_Tanda int,
NumeroAsiento int,
FechaHora datetime,
NombreEvento varchar(150),
NombreTipoEvento varchar(150)
);
DECLARE @TableAux TABLE(
TotalComprado int,
NumeroAsiento int
);
BEGIN TRANSACTION
INSERT @TableA
(Id_Tiquete,FK_Asiento,FK_Tanda,NumeroAsiento,FechaHora,NombreEvento,NombreTipoEvento)
SELECT X.ID,AT.FK_Asiento,AT.FK_Tanda,A.Numero,T.FechaHora,E.Nombre,TE.Nombre
FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
INNER JOIN BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
INNER JOIN BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
INNER JOIN BoleteriaTeatroDB.dbo.BT_Evento E ON E.Id = T.FK_Evento
INNER JOIN BoleteriaTeatroDB.dbo.BT_TipoEvento TE ON TE.Id = E.FK_TipoEvento
INNER JOIN BoleteriaTeatroDB.dbo.BT_Asiento A ON A.Id = AT.FK_Asiento
WHERE TE.Nombre = 'Opera' AND (T.FechaHora BETWEEN @FechaIni AND @FechaFin)
INSERT @TableAux
(TotalComprado,NumeroAsiento)
SELECT COUNT(NumeroAsiento) AS TotalComprado,NumeroAsiento FROM @TableA
GROUP BY NumeroAsiento
SELECT TOP 10 TotalComprado,NumeroAsiento FROM @TableAux ORDER BY TotalComprado DESC
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN 1;
END TRY
BEGIN CATCH
EXEC BT_SP_GetErrorInfo;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
RETURN @@ERROR*-1;
END CATCH
END
GO
--EXEC BT_SP_ASIENTOS_PREFE_OPERA '2014-11-21 00:00:00.000', '2015-11-20 00:00:00.000'
Horas Trabajadas: 3 hora
Autor: Luis Diego Flores

0 comentarios:
Publicar un comentario
Suscribirse a Enviar comentarios [Atom]
<< Inicio