Avatar billede netroam Nybegynder
01. maj 2009 - 14:45 Der er 5 kommentarer og
1 løsning

Stilling med gennemsnitstal (evt. SQL Query Join?)

Hej eksperter!

Svært at komme på en sigende overskrift, men here goes:

Jeg sidder med et lille hyggekonkurrence-site, hvor deltagerne registrerer antal skridt, de går hver dag. Tabellerne er som følger:

- Brugere
ID, Brugernavn, Navn, Hold ... osv.

- Hold
ID, BrugerID, Navn

- Indtastninger
ID, BrugerID, Hold, Dato, Indtastning


Brugerne opretter eller tildeles et hold, hvis ID også kommer ind i bruger-tabellen.

Nu vil jeg igang med at lave en komplet stilling, men stillingen skal sorteres efter DAGSGENNEMSNITTET. Dvs. at man skal tage de samlede indtastninger grupperet efter Hold (F.eks. har Hold 1 haft 72.000 skridt på dag 1, mens Hold 2 har haft 67.000 skridt).

Problemet opstår, når jeg skal lave en SQL Query, der i første omgang finder ud af, hvor mange brugere, der er på det enkelte hold, hvorefter det tal deles med de samlede indtastninger, som igen deles med antallet af dage, hvor konkurrencen har været i gang. Altså:

((Indtastninger i alt / Antal Deltagere) / Dage)

Resultatet af ovenstående formel skal så vises i en stilling med nr. 1 til xx med Desc. sortering.

Nogen, der kan være behjælpelig med det?
Avatar billede erle Nybegynder
01. maj 2009 - 15:52 #1
Prøv:

SELECT b.navn "Hold navn", COUNT(a.brugernavn) "Bruger i gruppen", AVG(c.indtastning) "Skridt i gennemsnittet" FROM brugere a, hold b, indtastninger c WHERE c.dato="01-05-09" AND c.hold=b.id AND c.brugerid=a.id GROUP BY b.navn

Men syns nu din database er underligt sat op. Hvorfor er der et hold felt ved brugere? er der ingen brund til hvis der er sat ind under hold.
Avatar billede erle Nybegynder
01. maj 2009 - 15:53 #2
Kan se jeg glemte ORDER BY c.indtastning DESC
Avatar billede netroam Nybegynder
02. maj 2009 - 07:17 #3
Jeg har ikke lige haft mulighed for at teste det, da det er på firmaets netværk, men jeg får det testet på mandag.

Grunden til, at Hold også ligger under brugere er fordi, tabellen Hold KUN indeholder en incremental ID, brugerID'et på personen, der er holdkaptajn for holdet samt holdnavnet. Den viser ikke, hvor mange mennesker, der er medlem af holdet. På den måde er der kun 1 linje pr. hold i den tabel, hvorimod der kan være op til 5 personer med samme Hold under Bruger-tabellen.

I princippet kunne jeg måske have undladt Hold i Indtastninger-tabellen, men tænkte at det kunne give en lettere SQL Query at have den med.

Nu får et svar på mandag, når jeg har prøvet koden af :) På forhånd tak for hjælpen
Avatar billede netroam Nybegynder
04. maj 2009 - 15:55 #4
Nå, jeg fik da koden NÆSTEN til at fungere, og så skulle der ovenikøbet en masse tovtrækkeri til.

Jeg kom frem til følgende kode:

SELECT b.Holdnavn, b.ID, SUM(c.Indtastning) as SkridtIaltHold, (SUM(c.Indtastning) / $Dag) as Gennemsnit FROM skridt_brugere a, skridt_hold b, skridt_indtastninger c WHERE a.Hold=b.ID AND c.BrugerID=a.ID GROUP BY b.Holdnavn ORDER BY Gennemsnit DESC

$Dag er variablen for, hvor mange dage konkurrencen har strukket sig over. Det, jeg dog MANGLER i ovenstående kode er, at gennemsnittet skal findes ud fra antallet af deltagere på de respektive hold. F.eks. kan der godt være 5 deltagere på et hold, mens der kun er 3 på det andet. Der skal derfor en variabel mere ind i følgende:

(SUM(c.Indtastning) / $Dag) as Gennemsnit

Hvordan jeg lige finder ud af hvor mange deltagere, der er på holdet, ved jeg ikke hvordan jeg får lagt ind i den select-statement.

Jeg fandt antallet via følgende select:

SELECT count(Hold) as Antal FROM skridt_brugere where Hold = '$ID' GROUP BY Hold

$ID kom af b.ID fra den store select-statement. Men det dur ikke, da der så ikke bliver sorteret efter gennemsnittet. Hvordan får jeg gjort det hele i 1 select-statement?
Avatar billede netroam Nybegynder
07. maj 2009 - 11:52 #5
Okay - næste opdatering i denne tråd kommer her. NU har jeg fået den til at gennemføre SQL-statementet, så den sorterer efter gennemsnit. Det gør jeg via følgende statement:


SELECT b.Holdnavn, b.ID, SUM(c.Indtastning) as SkridtIaltHold, (SUM(c.Indtastning) / $Dag / (SELECT count(a.Hold) as Antal FROM skridt_brugere a where a.Hold = b.ID GROUP BY a.Hold)) as Gennemsnit FROM skridt_brugere a, skridt_hold b, skridt_indtastninger c WHERE a.Hold=b.ID AND c.BrugerID=a.ID GROUP BY b.ID ORDER BY Gennemsnit DESC


Nu får jeg bare et andet problem!! Hvordan tweaker jeg ovenstående SQL-statement til også at indeholde alle hold i databasen - altså også dem der endnu ikke har indtastet noget i databasen? De skal jo også være en del af stillingen men bare med 0 i gennemsnittet.
Avatar billede netroam Nybegynder
12. maj 2009 - 08:54 #6
Så fandt jeg endelig ud af problemet. Fik lavet en LEFT JOIN på den sidste select, jeg lavede, så den fik alle hold med i stillingen.

Men der kom jo desværre ikke flere svar, så jeg vil lukke spørgsmålet. Erle - hvis du vil have halvdelen af pointene, så læg et svar.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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