Avatar billede krummel Juniormester
27. oktober 2007 - 02:18 Der er 11 kommentarer og
1 løsning

avg & group by & order by

et eksempel.

Jeg har en tabel:
id, kroner, lande, dato

det samme land kan gå igen i flere rækker

Jeg ønsker at beregne et gennemsnit af kroner for forskellige lande med nyeste dato. Dvs. hvis et land går igen to gange, så er det kun rækken med den nyeste dato, som skal tælles med i average kroner.

Har prøvet med følgende, men det virker ikke efter hensigten:

$sql = mysql_query("SELECT AVG(kroner) as gns FROM Tabel WHERE ID>5 GROUP BY lande order by dato desc" , $db);
Avatar billede krummel Juniormester
27. oktober 2007 - 02:21 #1
Hvis det har noget at sige, så kan samme antal kroner og samme dato også godt gå igen i flere rækker.
Avatar billede arne_v Ekspert
27. oktober 2007 - 02:43 #2
hvis nyere MySQL så prøv:

SELECT land,AVG(kroner)
FROM tabel t1
WHERE dato = (SELECT MAX(dato) FROM tabel t2 WHERE t2.dato=t1.dato)
GROUP BY land
Avatar billede krummel Juniormester
27. oktober 2007 - 02:59 #3
version 5.0.37

Jeg formulerede mig måske forkert. Jeg ønsker et gennemsnit kroner for alle rækker (lande). Hvis et land optræder flere gange, så er det dog kun den med den nyeste dato som skal tælles med i average.

Så vidt jeg kan se, så vil dit eksempel kun lave en average for een bestemt dato.
Avatar billede arne_v Ekspert
27. oktober 2007 - 04:37 #4
"kun den med den nyeste dato som skal tælles med i average" og "kun lave en average
for een bestemt dato" er det ikke det samme ?
Avatar billede arne_v Ekspert
27. oktober 2007 - 04:38 #5
Måske hvis du viser nogle demo data, så kan vi bedre forstå hvilket output du vil have.
Avatar billede krummel Juniormester
27. oktober 2007 - 11:18 #6
Forsimplet eksempel (id>5 ses der bort fra i dette eksempel):

Id: 1, 2, 3, 4, 5, 6, 7
Kroner: 43, 45, 43, 100, 100, 87, 34
Lande: DK, DK, NO, UK, SV, SP, SP
dato: 12.12.06, 02.03.07, 02.03.07, 11.04.07, 23.02.06, 09.10.07, 17.07.07

Skal give et gennemsnit på resultat: 75

(45+43+100+100+87)/5 = 75
Som du kan se, så skal der laves en averages på alle, dog skal kun den nyeste datoer med, hvor et land går igen (et land skal kun tælles med een gang). Dato kolonnen er af typen 'date'.

Med dit eksemepel kan ikke få det rigtige resultat.

Håber det giver mening :-)
Avatar billede krummel Juniormester
27. oktober 2007 - 11:20 #7
hvis det har betydning, så står datoen i databasen som fx 2007-10-23
Avatar billede arne_v Ekspert
27. oktober 2007 - 17:19 #8
SELECT AVG(kroner)
FROM tabel t1
WHERE dato = (SELECT MAX(dato) FROM tabel t2 WHERE t2.dato=t1.dato AND t2.land=t1.land)

måske
Avatar billede krummel Juniormester
27. oktober 2007 - 20:16 #9
Desværre, det giver 64,57 - dvs. den tager et gennemsnit af alle records
Så den udelukker ikke de records som ikke skal med (id 1 og 7)

Andre idéer :-)
Avatar billede arne_v Ekspert
27. oktober 2007 - 20:38 #10
Prøv:

SELECT AVG(kroner)
FROM tabel t1
WHERE dato = (SELECT MAX(dato) FROM tabel t2 WHERE t2.land=t1.land);
Avatar billede krummel Juniormester
27. oktober 2007 - 20:48 #11
YES! Det virker i hvert fald på dette eksempel

Super

Smid et svar og få point
Avatar billede arne_v Ekspert
27. oktober 2007 - 20:50 #12
kommer her
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