2017-04-20 5 views
-1

nehme ich die folgenden Tabellen:Berechnung des Durchschnitts für jeden Schüler

- Tabelle Student

create table Student(
num int primary key identity, 
firstName varchar(30) not null, 
lastName varchar(30) 
) 

- Tischmodul

create table Module(
code int primary key identity, 
name varchar(30) not null, 
coefficient int not null) 

- Tabelle Notation

create table Notation(
stud int references student, 
Mod int references Module, 
DateExam datetime default getdate(), 
Note float check (Note between 0 and 20) 
primary key(stud , Mod)) 

Was ich will, ist Studentennamen, die Anzahl und Durchschnittswerte der Schüler angezeigt, von besten bis schlechtesten.

Update:

mittel = Summe (ni * ci)/sum (ci); c: Koeffizient. n: note

+1

Durchschnitt von was? – JohnHC

+1

Ihre Nummern ?, welche Zahlen? – Lamak

+0

Ich glaube nicht, dass Sie NOTE als Float verwenden möchten. Dezimal (x, y) wäre wahrscheinlich besser (abhängig davon, wie viele Dezimalstellen Sie verfolgen möchten.) – xQbert

Antwort

2

Diese für jedes Modul für jeden Schüler sowohl die Note bekommt, und deren Durchschnitt über alle Module

select s1.FirstName, s1.LastName, m2.name as module_name, n3.Note, x1.av_note 
from student s1 
left join notation n3 
    on n3.stud = s1.num 
left join module m2 
    on m2.code = n3.mod 
left join 
(
select stud, avg(note) as av_note 
from notation 
group by stud 
) x1 
    on s1.num = x1.stud 
order by av_note, lastname desc 
+0

Dies würde alle Schüler ohne Notizen ausschließen. sollten wir diese nicht behalten; aber ansonsten gut für db's Fensterfunktionen! : P – xQbert

+0

@xQbert Ich dachte nach links ... Wird bearbeiten – JohnHC

2

nicht Sie Modul benötigen Sie denken. und das geht davon aus, dass es sich bei dem Feld um das Feld handelt, das Sie mitteln möchten.

SELECT FirstName, LastName, Note, avg(note) over (partition by s.Num) AvgNote 
FROM Student S 
LEFT JOIN Notation N 
on S.Num = N.Stud 
GROUP BY FirstName, LastName, S.Num 
ORDER BY as AvgNote Desc 

Auch Float als Datentyp im Umgang mit Noten ist eine schlechte Idee. Float ist von Entwurf an ungenau, um einen kleineren Datenspeicherplatz zu unterstützen. Das ist egal, wenn es sich um wissenschaftliche Notation handelt und Präzision nicht notwendig ist, aber in diesem Fall halte ich eine Dezimalzahl für die bessere Wahl.

+0

Ich habe immer über Fensterfunktionen vergessen ... – JohnHC

+0

Sie sind leistungsstark. Ich bin nicht sicher, welcher Koeffizient auf Modul ist, also brauchen wir es vielleicht ... – xQbert

0

Hier ist meine Lösung:

select tab.num,tab.firstName, sum(noteMultiCoef)/sum(coefficient) as average from 
    (select st.num,st.firstName, coefficient, note*coefficient as noteMultiCoef 
    from notation nt, student st, Module md 
    where st.num= nt.stud 
    and nt.code = md.mod) tab 
    group by tab.num, tab.firstName 
    order by average desc 
Verwandte Themen