webForumDet fria alternativet

Medelvärde

11 svar · 791 visningar · startad av westman

westmanMedlem sedan aug. 2004249 inlägg
#1

Jag vill räkna ut medelåldern på studenterna vid varje universitets ort.

Tabellerna:

* student (här finns info om alla studenter)
* gar (info om vad studenterna går på för kurs)
* kurs (info om kurserna)
* inst (info om institutionerna)

Jag tycker något i denna stil borde funka:

SELECT ort, AVG(SELECT 2004 - född AS ålder FROM student) as MedelÅlder
from inst;

men det gör det inte...

Säg till om ni vill veta attributen i tabellerna.

(Access 2003)

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det är relevant att veta hur inst och student är relaterade.

Frågan blir enligt

select ort, avg(2004-född)
from inst join student on inst.id = student.instid
group by ort

där du får byta

on inst.id = student.instid

så att det passar med dina tabeller.

westmanMedlem sedan aug. 2004249 inlägg
#3

hmm, nej nu får jag syntax-fel...
(självklart ändrade jag "id" till "nr" osv)

Så här ser tabellerna ut:

student
pnr (nyckel)
född

inst
instnr (nyckel)
ort

kurs
kursnr (nyckel)
instnr (nyckel referens inst)

gar
pnr (nyckel referens student)
kursnr (nyckel referens kurs)

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Med den modellen blir frågan mer komplex

select ort, avg(2004-född)
from ((inst inner join kurs on inst.instnr = kurs.instnr)
inner join gar on kurs.kursnr = gar.kursnr)
inner join student on gar.pnr = student.pnr
group by ort
westmanMedlem sedan aug. 2004249 inlägg
#5
select ort, avg(2004-född)
from ((inst inner join kurs on inst.instnr = kurs.instnr)
inner join gar on kurs.kursnr = gar.kursnr)
inner join student on gar.pnr = student.pnr
group by ort;

funkar ej... "Ort kan referera till mer än en tabell..."

Jag testade skriva "select inst.ort, avg(..." men det fungerar inte heller.

Btw, är det verkligen så här krångligt, tar vi oss inte hals över huvud nu..?

LarsGMedlem sedan dec. 200012 464 inlägg
#6
select inst.ort, avg(2004-född)
from ((inst inner join kurs on inst.instnr = kurs.instnr)
inner join gar on kurs.kursnr = gar.kursnr)
inner join student on gar.pnr = student.pnr
group by inst.ort
westmanMedlem sedan aug. 2004249 inlägg
#7

ah, jag glömde ändra till inst.ort i slutet..
tack för din hjälp LarsG!

westmanMedlem sedan aug. 2004249 inlägg
#8

för att göra det enkelt så tar jag ytterligare en fråga på denna tråd.

SELECT namn, count(Gar.kursnr) AS samtidigt
FROM Student, Gar
WHERE Student.pnr=Gar.pnr
GROUP BY namn
HAVING count(Gar.kursnr)>2;

Koden ovan tar ut namnen på de som läser minst 2 kurser samtidigt. Hur skall jag göra ifall jag istället vill få ut hur många det är.

LarsGMedlem sedan dec. 200012 464 inlägg
#9
SELECT count(*) from (select 1
FROM Student, Gar
WHERE Student.pnr=Gar.pnr
GROUP BY namn
HAVING count(Gar.kursnr)>2
) dt
westmanMedlem sedan aug. 2004249 inlägg
#10

tack, d funkar perfekt

måste fråga vad "1" och "dt" står för?

LarsGMedlem sedan dec. 200012 464 inlägg
#11

1 är ett godtyckligt värde eftersom det är enbart antalet poster som är intressant.

dt står för delirium tremens

TravoniMedlem sedan okt. 20041 556 inlägg
#12

Vad står "delirium tremens" för då?
http://susning.nu/Delirium_tremens

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)