Avatar billede 0ffline Nybegynder
09. oktober 2004 - 13:33 Der er 28 kommentarer og
1 løsning

Sorter efter højeste værdi af output

Hej

Jeg har en rigtig hård nød her, jeg lige ville høre om det i det hele taget kan lade sig gøre at knække.

Kan det lade sig gøre at sorterer output fra en accessdb, således at den den selv laver en rangliste efter højeste værdi i 'output' ?
Eks.
|j_antalkampe| divideret med |j_antalkegler| = output
|l_antalkampe| divideret med |l_antalkegler| = output

etc ..

0ffline
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 13:36 #1
Glemte at hvis flere 'output' har samme værdi, skal den sorterer efter eks. |xxx_antalkegler|
Avatar billede eagleeye Praktikant
09. oktober 2004 - 13:41 #2
Ja det kan man godt regne i SQL sætninger, men du må komme med flere oplysninger har du to forskellige kolonner du skal regne på???

eks:

sql = "select (j_antalkampe/j_antalkegler) as antal from tabel order by (j_antalkampe/j_antalkegler) desc"
Avatar billede eagleeye Praktikant
09. oktober 2004 - 13:54 #3
du kan også lave en if sætning som tjekker de to "output" i mod hinanden og tager den støreste af de to, og sortere efter den højste:

sql = "select * from (select id, IIF (j_antalkampe/j_antalkegler>l_antalkampe/l_antalkegler, j_antalkampe/j_antalkegler, l_antalkampe/l_antalkegler) as antal from tabel) order by antal desc"
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 13:56 #4
Hmmm .. jeg har måske lavet databasen forkert fra start.
Denne sortering vil gerne ville høre om, skal gerne lave en rangliste over spillernes gennemsnit.
Der har jeg f.eks
|x_kampe|/|x_kegler|
|xx_kampe|/|xx_kegler|
|xxx_kampe|/|xxx_kegler|
|xxx_kampe| / |xxxx_kegler|

Hvor x er spillerens navn.
Hvis du gider kan du finde dasenbasen her.
http://www.angelica.dk/firmasport.mbd
Jeg tror det er nemmere hvis I ser for jer selv, da jeg ved mine forklaringer ikke lige sådan er til at finde ud af c´_)
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 13:59 #5
Det var selvfølgelig..
http://www.angelica.dk/firmasport.mdb
Avatar billede eagleeye Praktikant
09. oktober 2004 - 14:10 #6
Jeg har kikket på din db. Alt respekt men det er ikke den bedste måde det er lavet på. Det mest optimate ville være at lave en tabel med spiller og en tabel med 3 kolonner "spillerid", "kampe", "kegler"  så kan man lave det i en SQL sætning ved at lave JOIN på de to tabeller.

Det kan også lade sig gøre med den løsning har har dog kræver det at man laver det med X antal UNION, hvor X er lig med antallet af spillere. Da spillerne måske ændre navn eller der kommer nye til skal den så hente informationen fra databasen omkring spillerne. Princippet i det er sådan her:

sql = select * from ((select x_kampe/x_kegler as antal, x_kampe as navn from tabel) UNOION ALL (select y_kampe/y_kegler as antal, y_kampe as navn from tabel) UNOION ALL (..)) order by antal desc"

jeg kan godt prøve at lave et eksempel, men jeg syntes du bør overveje om du skal skifte DB design.
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 14:21 #7
Jeg havde en stærk mistanke om at det var noget skod jeg havde strikket der.
Jeg går igang med at ændre DB design, som du foreslår.
Hvad er "spillerid" i anden table?
Den "id" jeg har indikeret alle de planlagte 18 kampe, samt tidspkt er planlagde spilletid for kampen. De skal vel med i 2. table så, ikke?
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 14:22 #8
Vil du smide et eksempel på en JOINT på de 2 tabeller?
Avatar billede eagleeye Praktikant
09. oktober 2004 - 14:29 #9
Det man typisk gør er at havde en spiller tabel som indeholder information om spilleren navn, adresse, mm.

spillere
id : autonummer
navn : tekst


Så kan du lave en tabel som indeholder deres score, altså antal kampe og antal kegler. Du kan så enten vælge at det er en sum så der kun er en post pr spiller eller du kan gemme kamp_id'et så du kan se hvor meget hver spiller lavede i hver kamp.

Første forslag:
id : autonummer
spillerID  : tal  som er link til spillere tabellen
antal_kampe : tal  som tælles en op efter hver kamp
antal_kegler : tal  som man ligger antal kegler til erfter hver kamp


Anden forslag:
id : autonummer
spillerID  : tal  som er link til spillere tabellen
kampeID : tal  link til kamp tabellen
antal_kegler : tal  antal kegler i en kamp


I dne sidste kan du få antal kampe ved count og total antal kegler ved sum.


En join kunne se sådan her ud:

select (antal_kampe/antal_kegler) as antal, spillere.navn from spillere left join score on spillere.id score.spillerID order by (antal_kampe/antal_kegler) desc
Avatar billede eagleeye Praktikant
09. oktober 2004 - 14:30 #10
der mangler et = lig med tegn her:
left join score on spillere.id score.spillerID

Sådan her:
left join score on spillere.id = score.spillerID
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 14:39 #11
Det ser rigtigt lækkert ud. Nu har jeg da noget at lave resten af weekenden.
Ikke at jeg påstår at brikkerne er faldet helt på plads for mig, men din hjælp har i hvertilfælle givet mig en masse muligheder for at lege videre med det.
Og hvor bliver jeg glad når det endelig kommer til at virke optimalt.
Tusinde tak for din hjælp og vijle til at kigge min DB igennem.
Håber du får en rigtig god weekend c",)  / 0ffline
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 15:56 #12
Umiddelbar kan jeg kun få det til at køre fejlfrit ved:
sql = "select (antal_kampe/antal_kegler) as antal, spillere.navn from spillere left join score on spillere.id = score.spillerID order by 'antal' desc "

Men jeg kan ikke lige gennemskue, hvordan jeg udskriver sql'en
Avatar billede eagleeye Praktikant
09. oktober 2004 - 17:02 #13
Så kan du lave et loop som dette:

set rs=Conn.Execute(sql)
do while not rs.EOF
  response.write rs("navn") & " har gennemsnit " & rs("antal") & "<br>"
  rs.Movenext
loop
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 17:08 #14
Ja, dertil er jeg heldigvis kommet. Men jeg vil gerne kunne bruge værdien i
antal_kampe samt antal_kegler også.
De værdier ligger i tablen ' score'
Jeg har prøvet alt indenfor.... rs("score.antal_kampe") o.lign men det virker ikke.
Hvis du kan / vil hjælpe mig med det sidste, smider jeg 100 points i et andet spørgsmål for løsningen.
Derudover sorterer den ikke efter højeste antal, hvilket ser forkert ud i en highscoreliste :O)
Avatar billede eagleeye Praktikant
09. oktober 2004 - 17:20 #15
i recordset skal du ikke angive tabel navnet kun kolonne navnet:

rs("antal_kampe")
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 17:25 #16
Hvis jeg udelukkende skriver f.eks
  response.write rs("navn") & " har gennemsnit " & rs("antal") & " antal kampe " & rs("antal_kampe") & " antal kegler " & rs("antal_kegler") & " <br>"

Får jeg denne:
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede eagleeye Praktikant
09. oktober 2004 - 17:27 #17
Så skal du lige hvade de to kolonner med i SQL sætningen:

sql = "select (antal_kampe/antal_kegler) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID order by 'antal' desc "
Avatar billede eagleeye Praktikant
09. oktober 2004 - 17:32 #18
Det ikke fordi jeg ikke vil hjælpe vidre, men jeg er nød til at smutte. Jeg skal til "Se fodbold" aften :) Så jeg er nok først tilbage i morgen igen.
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 17:36 #19
Jamen, det virker jo også allerede næsten helt fantastisk.
Den mangler bare at liste navnene op efter højeste gennemsnit.
Avatar billede 0ffline Nybegynder
09. oktober 2004 - 20:13 #20
Hmmmm ....
Problemet med sorteringen ligger i at hvis spilleren kaldet 'suppleant' ikke har spillet nogle kampe, så vil værdien i |antal_kegler| & |antal_kampe| være 0.
Denne sql virker kun hvis værdien ikke er NULL.
Kan man ikke ændre lidt så den godtager 0 som et ciffer?

sql = "select (antal_kegler/antal_kampe) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID order by (antal_kegler/antal_kampe) desc "
Avatar billede eagleeye Praktikant
10. oktober 2004 - 15:22 #21
Problemet er man dividere med 0 hvis antal_kampe er 0 så kan inføre en iif i SQLen:

sql = "select iif(antal_kampe is null,0,(antal_kegler/antal_kampe)) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID order by (antal_kegler/antal_kampe) desc "
Avatar billede 0ffline Nybegynder
10. oktober 2004 - 15:59 #22
Det giver desværre samme fejl:
[Microsoft][ODBC Microsoft Access Driver]Numeric value out of range (null)
Avatar billede eagleeye Praktikant
10. oktober 2004 - 16:03 #23
Prøv også at sætte iif på order by men jeg kan ikke helt huske om det virker:

sql = "select iif(antal_kampe is null,0,(antal_kegler/antal_kampe)) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID order by iif(antal_kampe is null,0,(antal_kegler/antal_kampe)) desc "


Eller så prøv at lave det sådan her:

sql = "select * from (select iif(antal_kampe is null,0,(antal_kegler/antal_kampe)) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID) order by antal desc "
Avatar billede 0ffline Nybegynder
10. oktober 2004 - 16:12 #24
Desværre, ingen af forslagene virkede.
Men det er nu heller ikke værrer end at jeg kan vente med at tilføje suppleanten indtil han har spillet mindst 1 kamp.
Jeg syntes du har været ufattelig hjælpsom endnu engang, og har hjulpet mig en hel del længere i mit forløb.
Jeg fandt da ud af hvordan man sorterede over 2 værdier m.m

Endnu engang tusinde tak for hjælp og hjælp til selvhjælp
Jeg opretter lige et spg. for du kan få dine velfortjente points
Avatar billede 0ffline Nybegynder
10. oktober 2004 - 16:15 #25
Avatar billede eagleeye Praktikant
10. oktober 2004 - 16:16 #26
ok, hvis der står 0 i antal_kampe så kan kan du prøve sådan her så den både tjekker for Null og 0:

sql = "select iif(antal_kampe is null or antal_kampe=0,0,(antal_kegler/antal_kampe)) as antal, antal_kampe, antal_kegler, spillere.navn from spillere left join score on spillere.id = score.spillerID order by iif(antal_kampe is null or antal_kampe=0,0,(antal_kegler/antal_kampe)) desc "
Avatar billede 0ffline Nybegynder
10. oktober 2004 - 16:19 #27
Lige i øjet.
Det virker perfekt.
Avatar billede eagleeye Praktikant
10. oktober 2004 - 16:20 #28
Hvis spilleren ikke er i score tabellen vil antal_kampe være lig Null. Hvis spilleren er i score tabellen og har antal_kampe=0 vil det give divide by 0 fejl. Så men den sidste skulle den tage højde for begge tilfælde.

Hvis du vil udelade spillere som ikke er i score tabellen kan du ændre "left join" til "inner join" så medtager den kun poster hvor der er data i begge tabeller.
Avatar billede 0ffline Nybegynder
10. oktober 2004 - 16:22 #29
Fantastisk, utroligt alt det jeg ikke ved!
Takker, og fortsat god weekend
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
Kurser inden for grundlæggende programmering

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