09. oktober 2004 - 13:33Der 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
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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"
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´_)
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.
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?
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
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
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
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)
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 "
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 "
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 "
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 "
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
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 "
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.
Fantastisk, utroligt alt det jeg ikke ved! Takker, og fortsat god weekend
Synes godt om
Ny brugerNybegynder
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.