martes, 25 de noviembre de 2014

Procedure: problema 1 y problema 2 Edward



DESCRIPCION:

1) Los 3 número de semana del año (un valor entre 1 y 52), que en promedio (considerando todos los años de historia) asisten mas personas al teatro nacional.
Entradas: Ninguna.
Salidas: Numero de semana, Cantidad de asistentes promedio. En orden descendente de la cantidad.

2) Idem 1), pero no referido a la cantidad de personas, sino al ingreso total de la taquilla.

PROBLEMAS:

En este metodo se encontraron muchos problemas, en general por errores al insertar asientoXtanda ya que los fk los teniamos intercambiados y lo cual generaba muchos errores.

Otro problema es que estaba insertando los usuarios repetidos en la base de datos.

Entre los errores estaban que se intentaba llamar un querry dentro de otro generando errores.



El codigo de este procedimiento es el siguiente:



-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASISTENCIAS_SEMANAS_ANNO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_ASISTENCIAS_SEMANAS_ANNO;
GO

/* Los 3 número de semana del año (un valor entre 1 y 52), que en promedio 
(considerando todos los años de historia) asisten mas personas al teatro nacional.
Entradas: Ninguna.
Salidas: Numero de semana, Cantidad de asistentes promedio. En orden descendente de la cantidad.
*/
CREATE PROCEDURE BT_SP_ASISTENCIAS_SEMANAS_ANNO
AS
BEGIN
 BEGIN TRY
 
  DECLARE @Tabla TABLE (
   id int,
   Fecha datetime,
   NumSemana int
  );

  DECLARE @TablaSem TABLE(
   TotalAsist int,
   NumSemana int
  );

  DECLARE @TablaProm TABLE(
   NumSemana int,
   Promedio float
  );

  BEGIN TRANSACTION 
  
   INSERT @Tabla
   (id,Fecha,NumSemana)
   SELECT X.ID,T.FechaHora,DATEPART(week,T.FechaHora) AS Semana
   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
   ORDER BY T.FechaHora ASC

   INSERT @TablaSem
   (TotalAsist,NumSemana)
   SELECT COUNT(NumSemana) AS TotalAsist,NumSemana FROM @Tabla GROUP BY NumSemana

   INSERT @TablaProm
   (NumSemana,Promedio)
   SELECT NumSemana,AVG(TotalAsist) AS Promedio 
   FROM @TablaSem  T GROUP BY TotalAsist,NumSemana

   SELECT TOP 3 * FROM @TablaProm tp ORDER BY Promedio 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_ASISTENCIAS_SEMANAS_ANNO

-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_IGRESOS_SEMANAS_ANNO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_IGRESOS_SEMANAS_ANNO;
GO

/*  
Idem 1), pero no referido a la cantidad de personas, sino al ingreso total de la taquilla.
*/
CREATE PROCEDURE BT_SP_IGRESOS_SEMANAS_ANNO
AS
BEGIN
 BEGIN TRY
 
  DECLARE @Tabla TABLE (
   id int,
   Fecha datetime,
   NumSemana int,
   Precio money
  );

  DECLARE @TablaSem TABLE(
   TotalDinero money,
   NumSemana int
  );

  DECLARE @TablaProm TABLE(
   NumSemana int,
   PromedioDinero money
  );

  BEGIN TRANSACTION 
  
   INSERT @Tabla
   (id,Fecha,NumSemana,Precio)
   SELECT X.ID,T.FechaHora,DATEPART(week,T.FechaHora) AS Semana,X.PrecioTotal
   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
   ORDER BY T.FechaHora ASC

   INSERT @TablaSem
   (TotalDinero,NumSemana)
   SELECT SUM(Precio) AS TotalDinero,NumSemana FROM @Tabla GROUP BY NumSemana

   INSERT @TablaProm
   (NumSemana,PromedioDinero)
   SELECT NumSemana,AVG(TotalDinero) AS Promedio 
   FROM @TablaSem  T GROUP BY TotalDinero,NumSemana

   SELECT TOP 3 * FROM @TablaProm tp ORDER BY PromedioDinero 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_IGRESOS_SEMANAS_ANNO


Horas Trabajadas: 3.5 hora
Autor: Edward Ovares Villegas

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio