Procedura T-SQL

0

Witam,
pomoże ktoś i wytłumaczy łopatologicznie ? ;)
Dane są tabele Student (IDStudenta, NrIndeksu, Rok, Imie, Nazwisko) oraz Ocena (IDOceny, IDStudenta (FK), Wartosc, Przedmiot)
Napisz procedurę T-SQL z parametrami rok i średnia. W procedurze przejrzyj wszystkich studentów określonego parametrem roku, wypisując średnią każdego z nich oraz kasując studentów (i ich oceny), którzy mają średnią poniżej zadanej przez użytkownika w parametrze. W tabelach NIE jest włączone kaskadowe usuwanie.
Pozdrawiam

2

Robisz pętelkę w której sterujesz się po wszystkich studentach na wybranym roku, i liczysz ich średnia, po czym usuwasz wszystkich którzy mają oceny poniżej średniej. Ok pokaż dalej kod.

0

zacząłem tak i pewnie źle??

   @ROK INT
   AS BEGIN
   DECLARE @SREDNIA DECIMAL(10,2)
	SELECT @SREDNIA = AVG (WARTOSC) FROM Ocena  ```
1

Nieee musisz stowrzyc konkretnego selecta. A już na pewno nie tak wygląda select.

Loop 1..count(rows)
Select AVG(wartość)
from oceny where rok in(2019)
End loop;

Sprawdź czy tak wygląda pętla w t-sql bo nie wiem czy akurat ta występuje.

EDIT no z telefonu tego nie sformatuje ładnie.

0

'''
WHILE
COUNT(IDStudenta) > 0
BEGIN
SELECT AVG(Wartosc) FROM Oceny WHERE Rok = @ROK
END

4

@kate87 serio? pętla do select i delete

CREATE PROCEDURE [dbo].[SREDNIA] @avg numeric(18,2), @rok integer
AS
--policz srednie dla studentow i zapamietaj wynik
select
    student.*
    ,srednia
into
    #tmpAVG
from 
    Student
    inner join (Select
				idStudenta
				,Avg(Wartosc) as srednia
			 from
			    ocena
			 group by
				idStudenta) s on s.idStudenta = student.idstudenta
where
    rok = @rok

--usun oceny i studentów poniżej sredniej
delete from Ocena where idstudenta in (select idStudenta from #tmpAVG where srednia < @avg)
delete from Student where idstudenta in (select idStudenta from #tmpAVG where srednia < @avg)


--pokaż wynik
select * from #tmpAVG
drop table #tmpAVG
1

Nie uczyli jeszcze tego myku z tabelą tymczasową, więc to rozwiązanie odpada ;P

No to bez tabel tymczasowych:

CREATE PROCEDURE [dbo].[SREDNIA] @avg NUMERIC(18,2), @rok INTEGER
AS
--pokaż średnie studentów
SELECT
    student.*
    ,srednia
FROM 
    Student
    INNER JOIN (SELECT
                idStudenta
                ,Avg(Wartosc) AS srednia
             FROM
                ocena
             GROUP BY
                idStudenta) s ON s.idStudenta = student.idstudenta
WHERE
    rok = @rok
 
--usun oceny studentów poniżej sredniej
DELETE 
FROM 
    Ocena     
WHERE idstudenta IN (SELECT
					   student.idstudenta
				    FROM 
					   Student
					   INNER JOIN (SELECT
								idStudenta
								,Avg(Wartosc) AS srednia
							  FROM
								ocena
							  GROUP BY
								idStudenta
							  HAVING
								AVG(WARTOSC) < @avg) s ON s.idStudenta = student.idstudenta
				    WHERE
					   rok = @rok)
 

--usun studentow
DELETE FROM Student WHERE idstudenta not IN (SELECT idStudenta FROM ocena) and rok = @rok
0

Macie pomysł na 2 wyzwalacze do tego zadania ?? :

  1. Nie pozwoli usuwać ocen.
  2. Nie pozwoli na zmianę IDStudenta oraz przedmiotu dla oceny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1