No veo que haya dificultad para resolver el ejercicio, es cuestión de entender lo que hay que hacer.
En el punto 1 hay que crear un procedimiento y recibe de parámetro el Id de Compteción, por ende la instrucción es:
CREATE PROCEDURE SPA_ActualizaGanador @IdCompeticion int
AS
Ahí definis el procedimiento y el parámetro de entrada.
Luego nos resta definir que es lo que hay que hacer.
El problema nos plantea lo siguiente:
[list=2]
[*]Actualiza al ganador si contesto correctamente para esa competencia todas las preguntas
[*]Caso contrario no actualiza nada
[/list]
Ahora bien... ¿De qué manera podemos obtener esa información a partir del DER para armar la Query?.
El DER nos dice que para saber si una pregunta es correcta o no, hay que usar la entidad Respuesta.
Entonces partimos de nuestra tabla competiciones y ver como procedemos a obtener la información:
SELECT Comp.idCompeticion, JUG.IdJugador, count(1) as RespuestasCorrectas FROM COMPETICIONES COMP
INNER JOIN LOGS LOG
ON COMP.IdCompeticion = LOG.COMPETICION
INNER JOIN RESPUESTA RESP
ON RESP.idRespuesta = LOG.Respuesta
INNER JOIN JUGADORES JUG
ON JUG.idJugador = LOG.Jugador
WHERE COMP.idCompeticion = @IdCompeticion
AND RESP.EsCorrecta = 'S'
GROUP BY Comp.idCompeticion, JUG.IdJugador
Acá obtenemos la cantidad de respuestas que tiene cada jugador para la competición en cuestión. Como solamente nos pide actualizar si hay alguno con 6 respuestas, debemos filtrar la consulta hecha para considerar esa condición. Para eso agregar la instrucción HAVING
SELECT Comp.idCompeticion, JUG.IdJugador, count(1) as RespuestasCorrectas FROM COMPETICIONES COMP
INNER JOIN LOGS LOG
ON COMP.IdCompeticion = LOG.COMPETICION
INNER JOIN RESPUESTA RESP
ON RESP.idRespuesta = LOG.Respuesta
INNER JOIN JUGADORES JUG
ON JUG.idJugador = LOG.Jugador
WHERE COMP.idCompeticion = @IdCompeticion
AND RESP.EsCorrecta = 'S'
GROUP BY Comp.idCompeticion, JUG.IdJugador
HAVING COUNT(1) = 6
En este punto tenemos casi todo resuelto, ya sabemos la cantidad de jugadores con 6 respuestas correctas. El paso final es ver como usar esta información para actualizar en la tabla de competicion.
Para ello debemos declarar una variable en el procedimiento que almacena el IdJugador que tiene 6 respuestas y actualizar.
Para declarar una variable hay que usar:
DECLARE @variable INT;
Solo nos queda asignarle a esa variable el Id de Jugador con 6 respuestas correctas:
SELECT @variable = JUG.IdJugador
FROM COMPETICIONES COMP
INNER JOIN LOGS LOG
ON COMP.IdCompeticion = LOG.COMPETICION
INNER JOIN RESPUESTA RESP
ON RESP.idRespuesta = LOG.Respuesta
INNER JOIN JUGADORES JUG
ON JUG.idJugador = LOG.Jugador
WHERE COMP.idCompeticion = @IdCompeticion
AND RESP.EsCorrecta = 'S'
GROUP BY Comp.idCompeticion, JUG.IdJugador
HAVING COUNT(1) = 6
Nota:
Si la query no retorna valores, la variable te queda en null.
El resto del procedimiento es hacer updates y retornar 1 o 0.
En resumen, el procedimiento sería el siguiente:
CREATE PROCEDURE SPA_ActualizaGanador @IdCompeticion int
AS
BEGIN
-- declaro variable
DECLARE @idJugador INT, @ActualizoDato INT = 1
--obtengo Id Jugador con 6 respuestas
SELECT @idJugador = JUG.IdJugador
FROM COMPETICIONES COMP
INNER JOIN LOGS LOG
ON COMP.IdCompeticion = LOG.COMPETICION
INNER JOIN RESPUESTA RESP
ON RESP.idRespuesta = LOG.Respuesta
INNER JOIN JUGADORES JUG
ON JUG.idJugador = LOG.Jugador
WHERE COMP.idCompeticion = @IdCompeticion
AND RESP.EsCorrecta = 'S'
GROUP BY Comp.idCompeticion, JUG.IdJugador
HAVING COUNT(1) = 6
-- Si tengo un id de jugador actualizo la tabla
IF @idJugador IS NOT NULL
BEGIN
SET @ActualizoDato = 0
UPDATE COMPETICIONES
SET GANADOR = @IdJugador
WHERE idCompeticion = @IdCompeticion
END
--Indico si retorno 1 o 0 en funcion si actualizo o no.
Select @ActualizoDato as Valor
END
A grandes rasgos es así, fijate si te sirve y ver de encarar el de SQL solo. Sino chiflá.