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

Entradas populares de este blog

Primera Reunión

Reporte Final

Segunda Reunión