martes, 25 de noviembre de 2014

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