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
- Rejestracja:prawie 7 lat
- Ostatnio:prawie 6 lat
- Postów:17

- Rejestracja:ponad 15 lat
- Ostatnio:około 3 lata
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.




- Rejestracja:ponad 15 lat
- Ostatnio:około 3 lata
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.
- Rejestracja:ponad 22 lata
- Ostatnio:około 2 godziny
- Postów:3874
@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


- Rejestracja:ponad 22 lata
- Ostatnio:około 2 godziny
- Postów:3874
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
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.