Avatar billede anykey Nybegynder
07. juni 2002 - 00:11 Der er 9 kommentarer og
1 løsning

Gennemsnit af row ?

Jeg skal bruge en sql-query eller en funktion i php, der kan regne gennemsnittet ud af et row i en mysql-db..
fx kunne det så sån' her ud:
+-------+--------+--------+
|Navn  |yada    |yada2  |
+-------+--------+--------+
|Mig    |20      |10      |
+-------+--------+--------+
|test  |10      |        |
+-------+--------+--------+

Så skal jeg kunne lave en forspørgsel, der fx SELECTER et eller andet WHERE Navn = 'Mig' - og så får jeg gennemsnittet ud af yada og yada2. Men hvis feltet er tomt, skal den ikke regne det med i gennemsnittet..
fx vil gennemsnittet af Navn='test' blive 10, og ikke 5, fordi man måske antager at et tomt felt = værdien 0, men som sagt.. det skal ikke regnes med!

Faktisk leder jeg bare efter en AVG() func. til rows.. IKKE colums.. problemet ligger i, at den netop ikke skal regne tomme bokse med i gennemsnittet!

Håber der er en løsning!
Avatar billede limemedia Nybegynder
07. juni 2002 - 03:12 #1
Følgende virker fint på min 3.23.49

SELECT (IFNULL(yada, yada2)+IFNULL(yada2, yada))/2 AS ColAvg
WHERE Navn='mig'
FROM test

Funktionen IFNULL(yada, yada2) vil validere yada = null, hvis ja, returner yada2 ellers returner yada. Dvs. at hvis fx. yada er null, regner vi gennemsnittet som (yada2+yada2) / 2 - hvilket igen giver yada2. Fremgangsmåden virker kun med 2 felter, hvis tre eller flere, skal du ud i nogle længere if statements

Se iøvrigt : http://www.mysql.com/doc/C/o/Control_flow_functions.html

/ LJ
Avatar billede anykey Nybegynder
07. juni 2002 - 09:13 #2
heh.. det bliver lidt noget slamkode så.. hehe.. jeg har nemlig 10 felter, men kan det ikke gøres ved fx at hente * FROM table WHERE navn='mig' fx.. og smide det ind i et array, og i php, lave en funktion, der regner gennemsnittet ud af [1-9], og samtidig tager højde for, at den ikke skal regne de tomme felter i array'et med ?
Avatar billede proaccess Nybegynder
07. juni 2002 - 09:21 #3
Reelt så bure du redesigne din tabel...

Navn Type Point
Mig  Yada  20
Mig  Yada2  10
test Yada  10

Derefter vil du "bare" kunne bruge de3 sædvanlige AVG-funktioner...
Avatar billede limemedia Nybegynder
07. juni 2002 - 09:22 #4
jo, men vil være hurtigere med SQL end PHP...

/ LJ
... tager sig til hovedet og spørger, hvorfor stiller de ikke et reallife eksempel frem for det simple der ikke dækker det egentlige problemområde...
Avatar billede anykey Nybegynder
07. juni 2002 - 12:21 #5
okai okai.. så får i hele historien. Systemet skal kunne regne gennemsnittet af eksamenskaraktererne ud for en enkelt person, der er 10 forskellige fag. Problemet ligger i, at nogle elever ikke har alle fag, og når felterne i databasen er tomme, så bør de selvfølgelig ikke blive regnet med i gennemsnittet!
og til proaccess> Hvis jeg redesigner mit tabel, så opstår problemet jo bare når jeg skal regne gennemsnittet for et enkelt fag ud.. 2 sek, jeg smider lige et billede af tablet ud på http://80.197.122.32/tabel.html
giv mig lige 2 mins!
Avatar billede anykey Nybegynder
07. juni 2002 - 12:40 #6
sådan... så har I hele problemstillingen.. så mangler vi bare en løsning ;)
Avatar billede proaccess Nybegynder
07. juni 2002 - 12:46 #7
>anykey: efter ovenstående redesign bruger du

Gennemsnit for 1 person: SELECT Navn, AVG(Point) AS Gennemsnit FROM Tabel GROUP BY Navn;
Gennemsnit for 1 fag: SELECT Type, AVG(Point) AS Gennemsnit FROM Tabel GROUP BY Type;

Jeg kan ikke se den store forskel/problemstilling... TVÆRTIMOD!
Avatar billede anykey Nybegynder
07. juni 2002 - 12:50 #8
andet, end det bliver en enormt stor db så.. det bliver 10 rows for hver elev, det virker sån' lidt slamkode agtigt? Well.. hvis der ikke er andre måder, så må jeg vel gøre det på den.. :/
Jeg smutter på arbejde nu, er tilbage engang i aften, og ser om, der ikke skulle være andre forslag...
Avatar billede proaccess Nybegynder
07. juni 2002 - 12:57 #9
Nu kender jeg ikke ligefrem termen "slamkode"

- men dette er faktisk det, som udgør forskellen mellem regneark og databaser...

Det du registrerer i din tabel er faktisk 1 karakter pr. person/fag.
Den eneste rigtige måde at repræsentere dette i en relationel database er ved ovenstående model: Navn, Fag, Karakter med een række pr. Navn- og fagkombination.

Det skal siges at du overhovedet ikke længere skal tænke på Null-værdi'er, da disse slet ikke skal være oprettet som rækker i din tabel! - så slap du da for dem...
Avatar billede anykey Nybegynder
07. juni 2002 - 16:19 #10
det er selvfølgelig rigtigt nok ;) jeg laver det hele om, og så får du de points :)
Takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester