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
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.
zacząłem tak i pewnie źle??
@ROK INT
AS BEGIN
DECLARE @SREDNIA DECIMAL(10,2)
SELECT @SREDNIA = AVG (WARTOSC) FROM Ocena ```
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.
'''
WHILE
COUNT(IDStudenta) > 0
BEGIN
SELECT AVG(Wartosc) FROM Oceny WHERE Rok = @ROK
END
@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
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
Macie pomysł na 2 wyzwalacze do tego zadania ?? :
- Nie pozwoli usuwać ocen.
- Nie pozwoli na zmianę IDStudenta oraz przedmiotu dla oceny.