Procedura T-SQL

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

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

Marcin.Miga
A najlepiej po usunięciu takiego gościa, ponownie liczysz średnią i usuwasz... I tym sposobem wywalasz prawie wszystkich delikwentów :)
kate87
Oprócz ostatniego.😉
kate87
Chyba przerzucenie danych do tabelki tymczasowej i skasowanie wszystkiego co w tabelce tymczasowej by było lepsze.😉
X1
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 6 lat
  • Postów:17
0

zacząłem tak i pewnie źle??

Kopiuj
   @ROK INT
   AS BEGIN
   DECLARE @SREDNIA DECIMAL(10,2)
	SELECT @SREDNIA = AVG (WARTOSC) FROM Ocena  ```
X1
na początku CREATE PROCEDURE SREDNIE
kate87
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 3 lata
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.

edytowany 1x, ostatnio: kate87
X1
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 6 lat
  • Postów:17
0

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

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 godziny
  • Postów:3874
4

@kate87 serio? pętla do select i delete

Kopiuj
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
edytowany 1x, ostatnio: Panczo
Zobacz pozostałe 2 komentarze
X1
Nie uczyli jeszcze tego myku z tabelą tymczasową, więc to rozwiązanie odpada ;P
Aventus
Nie wdaje sie w dyskusje petla vs tabela tymczasowa. Chce tylko odniesc sie do tego: "Nie uczyli jeszcze tego myku z tabelą tymczasową, więc to rozwiązanie odpada". O ile sie nie myle studia maja Ci wskazac droge do rozwoju, tematy to drazenia itp. Co za tym idzie nie wydaje mi sie zeby bylo cos zlego w zastosowaniu czegos, czego nie przerabialiscie a czego sam sie nauczyles. Podkreslam ostatnie slowo- wazne zeby zrozumiec jak cos dziala i dla czego.
X1
W pełni się zgadzam, rozumiem i dziękuję wszystkim za pomoc. Mój komentarz nie był na poważnie o czym świadczy " ;P "
kate87
Ale trochę też mierz siły na zamiary. Jeśli prowadzący widzi że tydzień wcześniej patrzyłeś na niego jak na kosmitę, a za tydzień przynosisz kod bez mała produkcyjny to choćby nie wiem jak Cię lubił nie uwierzy że sam to napisałeś.😉
X1
Ja nic nikomu nie będę przynosił, ja muszę i chcę do 27.01 nauczyć się procedur, triggerów i kursorów. Joiny zaliczyłem na 3+, z tym jest mi trudniej i mało czasu..
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 godziny
  • Postów:3874
1

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

No to bez tabel tymczasowych:

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

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

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

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.