Tercer Reunión
Tercera reunión
Aprox (5hrs)
Implementación de las 3 consultas solicitadas por el enunciado del proyecto
+Primera Consulta:
La primera consulta que se pide, para el uso de la base de datos de este proyecto, es retornar la actividad de las acciones, esto filtrado por la empresa (emisor) a cual las acciones referencian y un rango de fechas en las que estas tiene actividad de algún tipo. La consulta debe retornar:
-El último precio con el que quedó una acción
-El promedio de los precios que tuvo durante el rango ingresado
-La cantidad de dueños que tuvo durante el rango ingresado
Todo esto debe ser mostrado en orden descendente.
La versión final de este Stored Procedure es la siguiente:
CREATE proc [dbo].[sp_HistoricoAcciones](@emisor int, @fechamin date, @fechamax date)
as
begin
--------------------
DECLARE @TAcciones table (id int identity(1,1), Empresa int, Accion int, PrecioActual float, PrecioPromedio float, CantidadDueños int)
declare @codigo int
insert @TAcciones(Empresa, Accion, PrecioActual, PrecioPromedio, CantidadDueños)
Select IdEmisor,Accion.ID, PrecioAcutal, 0, 0 from MovAccion join
Operacion on MovAccion.ID_operacion = Operacion.ID join
Accion on MovAccion.IdAccionTramitada = Accion.ID where Fecha > @fechamin and Fecha < @fechamax and IdEmisor = @emisor
declare @min int = (select min(id) from @TAcciones)
declare @max int = (select max(id) from @TAcciones)
declare @suma int
declare @dueños int
while @min <= @max
begin
set @codigo = (select Accion from @TAcciones where id = @min)
-- set precio actual
update @TAcciones
set PrecioActual = (select top 1 Precio from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax) order by MovAccion.ID desc) where id = @min
-- set precio promedio
set @dueños = (Select count(*) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
set @suma = (Select sum(Precio) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
update @TAcciones
set PrecioPromedio = (@suma/@dueños) where id = @min
-- set cantidad dueños
update @TAcciones
set CantidadDueños = @dueños where id = @min
set @min = @min + 1
end
select Empresa, Accion, PrecioActual, PrecioPromedio, CantidadDueños from @TAcciones order by CantidadDueños desc
end
Versión 1.0 de la primera consulta:
USE [Acciones]
GO
/****** Object: StoredProcedure [dbo].[sp_HistoricoAcciones] Script Date: 20/06/2018 10:36:13 a.m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- entradas del sp--
ALTER proc [dbo].[sp_HistoricoAcciones](@emisor int, @fechamin date, @fechamax date)
as
begin
--------------------
DECLARE @TAcciones table (id int identity(1,1), Empresa int, Accion int, PrecioActual float, PrecioPromedio float, CantidadDueños int)
declare @codigo int
insert @TAcciones(Empresa, Accion, PrecioActual, PrecioPromedio, CantidadDueños)
Select IdEmisor,Accion.ID, PrecioAcutal, 0, 0 from MovAccion join
Operacion on MovAccion.ID_operacion = Operacion.ID join
Accion on MovAccion.IdAccionTramitada = Accion.ID where Fecha > @fechamin and Fecha < @fechamax and IdEmisor = @emisor
declare @min int = (select min(id) from @TAcciones)
declare @max int = (select max(id) from @TAcciones)
declare @suma int
declare @dueños int
begin
set @codigo = (select Accion from @TAcciones where id = @min)
-- set precio actual
update @TAcciones
set PrecioActual = (select top 1 Precio from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
where id = @min
-- set precio promedio
set @dueños = (Select count(*) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
)
set @suma = (Select sum(Precio) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
))
update @TAcciones
set PrecioPromedio = (@suma/@dueños) where id = @min
-- set cantidad dueños
update @TAcciones
set CantidadDueños = @dueños where id = @min
end
versión 2.0 de la primera consulta:
USE [Acciones]
GO
/****** Object: StoredProcedure [dbo].[sp_HistoricoAcciones] Script Date: 20/06/2018 10:36:13 a.m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- entradas del sp--
ALTER proc [dbo].[sp_HistoricoAcciones](@emisor int, @fechamin date, @fechamax date)
as
begin
--------------------
set @codigo = (select Accion from @TAcciones where id = @min)
-- set precio actual
update @TAcciones
set PrecioActual = (select top 1 Precio from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax) order by MovAccion.ID desc) where id = @min
-- set precio promedio
set @dueños = (Select count(*) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
set @suma = (Select sum(Precio) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
update @TAcciones
set PrecioPromedio = (@suma/@dueños) where id = @min
-- set cantidad dueños
update @TAcciones
set CantidadDueños = @dueños where id = @min
select Empresa, Accion, PrecioActual, PrecioPromedio, CantidadDueños from @TAcciones order by CantidadDueños desc
------------------------------------------------------------------------------------------------------------------------------------------------------
+Segunda consulta:
La segunda consulta busca que se implemente un Stored Procedure que regresa la lista de clientes ordenados descendientemente según la ganancia neta que haya obtenido por la especulación de las acciones. En otra palabra esta consulta nos pide calcular los ingreso y egresos de cada cliente para descubri cuanto ganancia le queda por el manejo de acciones que realiza, esto debe hacerse sobre un rango de fechs ingresado por el usuario
La versión final de este Stored Procedure:
CREATE PROCEDURE [dbo].[spGananciaPorEspeculacion]
@fechamin date,
@fechamax date
as
begin
DECLARE @TClienteIds table (id int identity(1,1), IdCLiente int)
DECLARE @TResult table (id int identity(1,1), IdCLiente int, especulacion int)
Insert @TClienteIds (IdCLiente) select ClienteCompra from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Cantidad = 1 group by ClienteCompra
Insert @TClienteIds (IdCLiente) select ClienteVende from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Cantidad = 1 group by ClienteVende
Insert @TResult (IdCliente, especulacion) select IdCLiente, 0 from @TClienteIds group by IdCLiente
DECLARE @min int = 1
DECLARE @max int = (select max(id) from @TResult)
DECLARE @sumatoriaCompra int
DECLARE @sumatoriaVenta int
DECLARE @idClienteTmp int
while @min <= @max
begin
Set @idClienteTmp = (Select IdCLiente from @TClienteIds where id = @min)
Set @sumatoriaCompra = (select sum(MovAccion.Precio) from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Operacion.ClienteCompra = @idClienteTmp and Cantidad = 1)
Set @sumatoriaVenta = (select sum(MovAccion.Precio) from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Operacion.ClienteVende = @idClienteTmp and Cantidad = -1)
if(@sumatoriaCompra is not null and @sumatoriaVenta is not null)
begin
Update @TResult
set especulacion = (@sumatoriaVenta - @sumatoriaCompra) where IdCLiente = @idClienteTmp
end
else if(@sumatoriaCompra is null)
begin
Update @TResult
set especulacion = (@sumatoriaVenta) where IdCLiente = @idClienteTmp
end
else
begin
Update @TResult
set especulacion = (@sumatoriaCompra * -1) where IdCLiente = @idClienteTmp
end
Set @min = @min + 1
end
Select * from @TResult order by especulacion desc
end
versión 1.0 de la segunda consulta:
CREATE PROCEDURE [dbo].[spGananciaPorEspeculacion]
@fechamin date,
@fechamax date
as
begin
Insert @TClienteIds (IdCLiente) select ClienteCompra from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Cantidad = 1 group by ClienteCompra
Insert @TClienteIds (IdCLiente) select ClienteVende from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Cantidad = 1 group by ClienteVende
Insert @TResult (IdCliente, especulacion) select IdCLiente, 0 from @TClienteIds group by IdCLiente
Set @idClienteTmp = (Select IdCLiente from @TClienteIds where id = @min)
Set @sumatoriaCompra = (select sum(MovAccion.Precio) from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Operacion.ClienteCompra = @idClienteTmp and Cantidad = 1)
Set @sumatoriaVenta = (select sum(MovAccion.Precio) from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID where (Operacion.Fecha between @fechamin and @fechamax) and Operacion.ClienteVende = @idClienteTmp and Cantidad = -1)
if(@sumatoriaCompra is not null and @sumatoriaVenta is not null)
begin
Update @TResult
set especulacion = (@sumatoriaVenta - @sumatoriaCompra) where IdCLiente = @idClienteTmp
end
else if(@sumatoriaCompra is null)
begin
Update @TResult
set especulacion = (@sumatoriaVenta) where IdCLiente = @idClienteTmp
end
else
begin
Update @TResult
set especulacion = (@sumatoriaCompra * -1) where IdCLiente = @idClienteTmp
end
Set @min = @min + 1
Select * from @TResult order by especulacion desc
------------------------------------------------------------------------------------------------------------------------------------------------------
+Tercera Consulta:
En la tercera consulta se nos pide mostrar las acciones de nuevo, pero en este caso es de forma global, sin filtrar por empresa, y mostrando la ganancia que proveyeron a sus dueños, esto debes mostrarse de forma descendente según dicha ganancia
La versión final de este Stored Procedure:
CREATE PROCEDURE [dbo].[spEspeculacionDescendiente]
@fechamin date,
@fechamax date
as
begin
DECLARE @TAccionesTramitadas table (sec int identity(1,1), IdAccionTramitada int, codigo int, promedio float)
Insert @TAccionesTramitadas (IdAccionTramitada, codigo,promedio) Select IdAccionTramitada, 0,0 from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID
where Operacion.Fecha > @fechamin and Operacion.Fecha < @fechamax and MovAccion.Cantidad = 1 group by IdAccionTramitada order by IdAccionTramitada asc
Update @TAccionesTramitadas
set codigo = (Select Codigo from Accion where IdAccionTramitada = Accion.ID)
declare @min int = (select min(sec) from @TAccionesTramitadas)
declare @max int = (select max(sec) from @TAccionesTramitadas)
declare @suma int
declare @dueños int
Declare @codigo int
while @min <= @max
begin
set @codigo = (select IdAccionTramitada from @TAccionesTramitadas where sec = @min)
-- set precio promedio
set @dueños = (Select count(*) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
set @suma = (Select sum(Precio) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
update @TAccionesTramitadas
set promedio = (@suma/@dueños) where sec = @min
set @min = @min + 1
end
Select * from @TAccionesTramitadas order by promedio desc
end
Versión 1.0 de la tercer consulta:
ALTER PROCEDURE [dbo].[spEspeculacionDescendiente]
@fechamin date,
@fechamax date
as
begin
DECLARE @TAccionesTramitadas table (sec int identity(1,1), IdAccionTramitada int, codigo int, promedio float)
Insert @TAccionesTramitadas (IdAccionTramitada, codigo,promedio) Select IdAccionTramitada, 0,0 from MovAccion join Operacion on MovAccion.ID_operacion = Operacion.ID
where Operacion.Fecha > @fechamin and Operacion.Fecha < @fechamax and MovAccion.Cantidad = 1 group by IdAccionTramitada order by IdAccionTramitada asc
Update @TAccionesTramitadas
set codigo = (Select Codigo from Accion where IdAccionTramitada = Accion.ID)
set @codigo = (select IdAccionTramitada from @TAccionesTramitadas where sec = @min)
-- set precio promedio
set @dueños = (Select count(*) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
set @suma = (Select sum(Precio) from MovAccion inner join Operacion
on MovAccion.ID_operacion = Operacion.ID where (idAccionTramitada = @codigo and Cantidad = 1)
and (Operacion.Fecha between @fechamin and @fechamax))
update @TAccionesTramitadas
set promedio = (@suma/@dueños) where sec = @min
Select * from @TAccionesTramitadas order by promedio desc
end
Comentarios
Publicar un comentario