SQL - SQL CORRECION

 
Vista:
sin imagen de perfil

SQL CORRECION

Publicado por Lucas Javier (1 intervención) el 27/11/2022 22:54:01
BUENAS, MI NOMBRE ES LUCAS.
ESTA CORRECTO ESTO ?? ES UN EXAMEN QUE ENCONTRE, PERO SE QUE TENGO ERRORES Y ME GUSTARIA VER EN Q ME EQUIVOQUE. GRACIAS !!!

1
2
3

--Al insertar una votación, verificar que el usuario
--que vota no lo haga más de una vez para el mismo concurso ni se pueda votar a sí mismo. Tampoco puede votar una fotografía descalificada.

CREATE TRIGGER TR_PUNTO1 ON Votaciones
INSTEAD OF INSERT
AS
BEGIN
DECLARE
@IDFotografia BIGINT,
@IDConcurso BIGINT,
@IDVotante BIGINT,
@IDParticipante BIGINT,
@CantVotos INT,
@Descalificada BIT,
@Fecha DATE,
@Puntaje DECIMAL

SELECT @IDFotografia = IDFotografia, @IDVotante = IDVotante, @Fecha = Fecha, @Puntaje = Puntaje FROM inserted
SELECT @IDConcurso = IDConcurso, @IDParticipante = IDParticipante, @Descalificada = Descalificada FROM Fotografias WHERE ID = @IDFotografia

SELECT @CantVotos = COUNT(IDVotante)
FROM Fotografias
INNER JOIN Votaciones ON Votaciones.IDFotografia = Fotografias.ID
WHERE IDConcurso = @IDConcurso AND IDVotante = @IDVotante

IF @CantVotos = 1 AND @IDVotante != @IDParticipante AND @Descalificada = 0
BEGIN
INSERT INTO Votaciones (IDVotante, IDFotografia, Fecha, Puntaje)
VALUES(@IDVotante, @IDFotografia, @Fecha, @Puntaje)
END
END


--Hacer un procedimiento almacenado llamado SP_Descalificar que reciba un ID de fotografía y realice la descalificación de la misma. También debe eliminar
--todas las votaciones registradas a la fotografía en cuestión. Sólo se puede descalificar una fotografía si pertenece a un concurso no finalizado.

CREATE PROCEDURE SP_Descalificar(@IDFotografia BIGINT)
AS
BEGIN
DECLARE
@FechaFinalizacion DATE

SELECT @FechaFinalizacion = Fin
FROM Fotografias
INNER JOIN Concursos ON Concursos.ID = Fotografias.IDConcurso
WHERE Fotografias.ID = @IDFotografia

IF @FechaFinalizacion > GETDATE() BEGIN
UPDATE Fotografias SET Descalificada = 1 WHERE ID = @IDFotografia
DELETE Votaciones WHERE IDFotografia = @IDFotografia -- ACA ME GENERA DUDA SI NO HAY Q PONER ALGO DE VOTACIONES EN EL ID
END
END

--OPCION 2

CREATE PROCEDURE SP_Descalificar(
@IDFotografia BIGINT
)
AS
BEGIN
DECLARE @Existe BIT
DECLARE @NoFinalizado BIT

SELECT @Existe = COUNT() FROM Fotografias WHERE ID = @IDFotografia

IF (SELECT C.Fin FROM Concursos C INNER JOIN Fotografias F ON F.IDConcurso = C.ID WHERE F.ID = @IDFotografia) < GETDATE()
BEGIN
SET @NoFinalizado = 1
END
ELSE BEGIN
SET @NoFinalizado = 0
END

IF @Existe != 0 AND @NoFinalizado = 1 BEGIN
DELETE FROM Votaciones
WHERE IDFotografia = @IDFotografia
UPDATE Fotografias
SET Descalificada = 1
WHERE @IDFotografia = ID
END
ELSE IF @Existe = 0 BEGIN
PRINT 'No existe la fotografía'
END
ELSE BEGIN
PRINT 'Error, el concurso no ha finalizado aun'
END
END

--Hacer un procedimiento almacenado llamado SP_Ranking que a partir de un IDParticipante se pueda obtener
--las tres mejores fotografías publicadas (si las hay). Indicando el nombre del concurso,
--apellido y nombres del participante, el título de la publicación, la fecha de publicación y el puntaje promedio obtenido por esa publicación.

CREATE PROCEDURE SP_Ranking(@IDConcurso BIGINT)
AS
BEGIN

SELECT TOP 3 Apellidos, Nombres, F.Titulo, Publicacion, Concursos.Titulo, (
SELECT ISNULL(AVG(Puntaje), 0)
FROM Votaciones
INNER JOIN Fotografias ON Fotografias.ID = Votaciones.IDFotografia
WHERE IDConcurso = @IDConcurso AND IDFotografia = F.ID
) as Promedio
FROM Participantes
INNER JOIN Fotografias F ON F.IDParticipante = Participantes.ID
INNER JOIN Concursos ON Concursos.ID = F.IDConcurso

ORDER BY (
SELECT ISNULL(AVG(Puntaje), 0)
FROM Votaciones
INNER JOIN Fotografias ON Fotografias.ID = Votaciones.IDFotografia
WHERE IDConcurso = @IDConcurso AND IDFotografia = F.ID
) DESC

END

-- OPCION 2

CREATE PROCEDURE SP_Ranking(
@IDParticipante bigint
)
AS
BEGIN
DECLARE @Existe BIT

SELECT @Existe = COUNT() FROM Fotografias WHERE ID = @IDParticipante

IF @Existe != 0 BEGIN
SELECT TOP 3 C.Titulo AS Concurso, P.Apellidos, P.Nombres, F.Titulo, F.Publicacion, AVG(V.Puntaje) AS PuntajeProm
FROM Fotografias F
INNER JOIN Concursos C ON C.ID = F.IDConcurso
INNER JOIN Participantes P ON P.ID = F.IDParticipante
INNER JOIN Votaciones V ON V.IDFotografia = F.ID
WHERE F.IDParticipante = @IDParticipante
GROUP BY C.Titulo, P.Apellidos, P.Nombres, F.Titulo, F.Publicacion
ORDER BY PuntajeProm DESC
END
ELSE BEGIN
PRINT 'No existe el participante'
END

END





--Hacer un listado en el que se obtenga: ID de participante,
--apellidos y nombres de los participantes que hayan registrado al menos dos fotografías descalificadas.

SELECT ID, Apellidos, Nombres FROM Participantes P
WHERE (SELECT COUNT(DISTINCT IDConcurso) FROM Fotografias WHERE IDParticipante = P.ID) >= 2

-- No iria HAVING ????



--Al insertar una fotografía verificar que el usuario creador de la fotografía tenga
--el ranking suficiente para participar en el concurso. También se debe verificar que el concurso haya iniciado
--y no finalizado. Además, el participante no debe registrar una descalificación en los últimos 100 días.
--Si ocurriese un error, mostrarlo con un mensaje aclaratorio. De lo contrario, insertar el registro teniendo en cuenta
--que la fecha de publicación es la fecha y hora del sistema.

--NOTA: Si una fotografía está descalificada. La fecha de descalificación corresponde a la fecha de fin del concurso de dicha fotografía.

CREATE TRIGGER TR_PUNTO2 ON Fotografias
AFTER INSERT
AS
BEGIN
DECLARE
@IDParticipante BIGINT,
@IDConcurso BIGINT,
@IDFotografia BIGINT,
@Titulo VARCHAR(150),
@Ranking DECIMAL(5,2),
@RankingConcurso DECIMAL(5,2),
@Descalificaciones BIGINT,
@FechaFinConcurso DATE,
@FechaInicioConcurso DATE

SELECT @IDParticipante = IDParticipante, @IDConcurso = IDConcurso, @IDFotografia = ID, @Titulo = Titulo FROM inserted
SELECT @RankingConcurso = RankingMinimo FROM Concursos WHERE ID = @IDConcurso

--Ranking del Participante.
SELECT @Ranking = ISNULL(AVG(Puntaje), 0)
FROM Votaciones
INNER JOIN Fotografias ON Fotografias.ID = Votaciones.IDFotografia
WHERE @IDParticipante = IDParticipante

--Fecha fin del Concurso.
SELECT @FechaFinConcurso = Fin FROM Concursos WHERE ID = @IDConcurso

--Fecha inicio del Concurso.
SELECT @FechaInicioConcurso = Inicio FROM Concursos WHERE ID = @IDConcurso

--Cant de descalificaciones del Participante en los ultimos 100 dias.
SELECT @Descalificaciones = COUNT(*)
FROM Fotografias
WHERE IDParticipante = @IDParticipante AND Descalificada = 1 AND Publicacion >= (GETDATE() - 100)

IF
@RankingConcurso > @Ranking OR
@Descalificaciones >= 1 OR
GETDATE() > @FechaFinConcurso OR
GETDATE() < @FechaInicioConcurso
BEGIN
ROLLBACK TRANSACTION
END
END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder