Avatar billede musti776 Nybegynder
21. august 2006 - 16:39 Der er 24 kommentarer og
1 løsning

Find de højeste 5 tal og lig dem sammen

Hej alle,

Som overskriften lyder.. Jeg har en tabel med mange forskellige tal.. Jeg har brug for at finde de 5 højeste og ligge dem sammen..

Ide til hvordan jeg gøre det?

Takker..
/Musti
Avatar billede keysersoze Ekspert
21. august 2006 - 16:49 #1
SELECT sum(tal) As totaltal FROM tabel ORDER BY tal desc
Avatar billede nielle Nybegynder
21. august 2006 - 18:37 #2
Muligvis sådan:

SELECT sum(talFelt) AS total (SELECT TOP 5 talFelt FROM dinTabel ORDER BY talFelt DESC)
Avatar billede arne_v Ekspert
21. august 2006 - 18:43 #3
hvis det skal vaere validt SQL skal det non vaere:

SELECT sum(talFelt) AS total FROM (SELECT TOP 5 talFelt FROM dinTabel ORDER BY talFelt DESC) x
Avatar billede nielle Nybegynder
21. august 2006 - 18:47 #4
Ahh ... sad lige og sloges med den uden det helt store held. Hvad gør det lille x i slutningen egentlig?
Avatar billede arne_v Ekspert
21. august 2006 - 19:03 #5
den giver queryen et "virtuelt tabel navn" som goer at man kan bruge x.feltnavn
til at refere til felter fra queryen, hvilket kan vaere noedvendigt hvis man joiner
flere tabeller

det er ikke tilfaeldet her, men i de fleste (alle ?) databaser er det navn
required
Avatar billede musti776 Nybegynder
22. august 2006 - 10:05 #6
Tak for input gutter.. undskyld jeg først svarer nu..
nu skal jeg høre engang.. som jeg også skrev har jeg mange talfelter..
Altså, p1, p2, p3, p4, p5, p6, p7 osv..

Hvordan vil koden se ud med disse oplysninger?
Avatar billede nielle Nybegynder
22. august 2006 - 11:06 #7
Skal det forstås sådan at du i hver række i din tabel har (mindst 7) værdier:

p1, p2, p3, p4, p5, p6, p7

- og at du øsnker at finde de 5 største af disse? Måske kunne du lige beskrive hvad det er for en slags data du har liggende? Hedder felterne "p1" osv., eller hedder de noget andet?
Avatar billede musti776 Nybegynder
22. august 2006 - 12:02 #8
Jeg har en tabel som er således:

- deltagernavn (tekst)
- deltager_beskrivelse (note)
- p1 (tal)
- p2 (tal)
- p3 (tal)
op til p12 (tal)

i de felter hvor jeg har p'er skriver jeg forskellige points ind..
Dvs. hvis en person deltager i alle turneringer får vedkommende points 12 gange..
Det som systemet så skal kigge på er, at tjekke alle points vedkommende har fået, finde de 5 største, ligge dem sammen og sortere efterfølgende...

Håber det er til at forstå :o)
Avatar billede nielle Nybegynder
22. august 2006 - 12:15 #9
Crytalgreen! Du burde have givet den beskrivelse allerede fra starten af. :^)

Jeg synes at det lyder lidt som om at du burde overveje om den ikke skal deles ud på to tabeller: En med deltagere, og en med deres point:

= Deltager =
deltagerId (tal)
deltagernavn (tekst)
deltager_beskrivelse (note)

= Point =
pointId (tal)
deltagerId - peger på Deltager-tabellen
turdering - (tal: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, eller 12)
point - (tal)

Med en sådan struktur vil det have værte rimeligt trivielt at klare det med SQL. Med din nuværende struktur, kommer vi ud i en større mængde ASP-kode.
Avatar billede musti776 Nybegynder
22. august 2006 - 12:39 #10
føj.. nu havde vi lavet det hele klar, men fandt først ude af at det skulle fungere sådan nu..

tror du ikke man kan lave noget smart med nuværende struktur og undgå at lave det hele forfra :(
Avatar billede nielle Nybegynder
22. august 2006 - 12:43 #11
Nej, man kan ikke rigtigt lave noget smart ... der er egentlig kun "hårdt" ASP-kodning ud af problemet. Og med 5 ud af 12 mulige, så bliver det nok rimeligt meget ASP-kode vi snakker om. :^|
Avatar billede musti776 Nybegynder
24. august 2006 - 21:11 #12
undskyld forsinkelsen gutter..
få lige svaret så vi kan afslutte.. :o)
Avatar billede nielle Nybegynder
25. august 2006 - 08:11 #13
Er du sikker på at du ikke ønsker at lave din database struktur om? For ellers kan vi da godt forsøge at løse problemet alligevel.
Avatar billede musti776 Nybegynder
30. august 2006 - 18:00 #14
nielle, undskyld igen igen at jeg har været lidt sent på den...
men hvis du kunne hjælpe vil jeg meget gerne lave database strukturen om og prøve på den måde..?
Avatar billede nielle Nybegynder
30. august 2006 - 23:15 #15
Jeg vil klart anbefale at du laver strukturen om. Men jeg er også klar over at du måske allerede har meget eksiterende kode, som så skal skrives delvist om. Selvfølgeligt kan problemet løses med din nuværende struktur, men løsningen bliver bare temmeligt "bøvlet" fordi at databasestrukturen ikke er optimal til lige det.

Så derfor ville jeg bare vide om:

1) Ønsker du at beholde den nuværende struktur, og så at vi laver den "bøvlede løsning*, eller at:
2) Du laver database strukturen om (med hvad der deraf følger), og at vi så kan lave den "elegante løsning" til dig?
Avatar billede musti776 Nybegynder
30. august 2006 - 23:32 #16
jeg har faktisk en færdig løsning klar som mangler denne her point funktion som den eneste.. altså både admin delen og stillingsside osv...

da point funktionen er et must er jeg nødt til at have den med på den ene eller anden måde..

jeg er faktisk frisk på at lave db strukturen om og lave det helt forfra men er lidt i tvivl om jeg kan finde tiden til det..

lad mig sige det sådan..

hvis vi fx. kan lave den bøvlede løsning på en enkelt dag vil jeg foretrække denne..

men tager den bøvlede løsning derimod 3 dage og den elegante 5 kan vi ligeså godt droppe det og lave det hele forfra..
Avatar billede nielle Nybegynder
30. august 2006 - 23:43 #17
Jeg kan ikke sige dig hvor lang tid den elegante tager ... for jeg ved jo ikke hvor meget kode du har som skal laves om. Selve løsningen tager dog ikke specielt lang tid. Vi snakker maks om en time eller noget i den stil.

Der er imidlertid andre grunde til at lave din database om (og vi snakker trods alt kun om en tabel af dem du måtte have i databasen). Den nuværende struktur er f.eks. ikke normaliseret. At normalisere en database er normalt begrundet ud fra sund fornuft - der er f.eks. ikke grund til at have de P# felter med i dit eksempel som alligevel ikke er udfyldt hvis personen ikke deltager i en af kampene. Det er dog ikke altid sort/hvidt, og tit vil man se at selv garvede databasefolk ser delvist bort fra normaliseringn af forskellige andre hensyn.

Men en normaliseret database betyder som regel at det er nemmere at lægge ny funktionalitet til på et senere tidspunkt. Den er altså mere vedligeholdelsevenlig.
Avatar billede musti776 Nybegynder
01. september 2006 - 17:49 #18
selvom det ikke er det helt optimale har min ven klaret det med js.. hvis du lige vil svare kan vi afslutte spørgsmålet..

tak for din tid..
Avatar billede nielle Nybegynder
01. september 2006 - 19:32 #19
Ok, fint nok, men:

1) Det er ikke alle brugere som har JavaScript slået til i deres browser.

2) For hver kode-tilpasning I laver oven på jerens nuværende struktur, desto sværere bliver det for jer at ændre jeres database på et senere tidspunkt.

3) Hvis I havde valgt at lægge strukturen om, ville løsningen have været nærmest triviel. Måske havde I oven i købet kunne spare tid ved en omlægning...

For at illustrere:
Avatar billede nielle Nybegynder
01. september 2006 - 19:32 #20
===== Med jeres nuværende tabel-struktur =====

sql = "SELECT * FROM dinTabel WHERE id = 42"
Set data = Conn.Execute(sql)

If Not data.EoF Then
    ' Opret et array til de 5 bedste resultater.
    Dim bedsteResultater(5)

    ' Nulstil pladserne.
    For idx=1 To 5
        bedsteResultater(idx) = 0
    Next

    ' Denne variabel sikre at vi kan håndtere situationen
    ' hvor at der evt. er et "hul" i listen af resultater.
    resultatNr = 0

    ' Gennemløb de mulige kampe.
    For kamp=1 To 12
        ' Find resultatet af den enkelte kamp.
        feltNavn = "p" & kamp
        resultat = "" & data(feltNavn)

        ' Hvis der er et reultat, undersøges det.
        If resultat = "" Then
            ' Optæl antallet af resultater.
            resultatNr = resultatNr+1
           
            ' Hvis der er færre end 5 resultater endnu,
            ' lægges resulatet direkt i listen
            If resultatNr<=5 Then
                bedsteResultater(resultatNr) = resultat
            Else
                ' Der er nu mere end 5 reultater.

                ' Find det mindste resultat i listen af resulater.
                minimumIdx = 1
                minimum = bedsteResultater(minimumIdx)

                For idx=2 To 5
                    If bedsteResultater(idx) < minimum Then
                        minimumIdx = idx
                        minimum = bedsteResultater(minimumIdx)
                    End If
                Next

                ' Overskriv det mindste med det nye.
                If resultat > minimum Then
                    bedsteResultater(minimumIdx) = resultat
                End If
            End If
        End If
    Next

    ' Udregn summen af de 5 bedste resultater.
    sum = 0
    For idx=1 To 5
        sum = sum + bedsteResultater(idx)
    Next

    ' Udskriv.
    Response.Write "Bedste 5 kampe: " & sum 6 "<br>"
Else
    Response.Write "Den pågældende spiller blev ikke fundet."
End If
Avatar billede nielle Nybegynder
01. september 2006 - 19:32 #21
===== Med tabel-strukturen fra 22/08-2006 12:15:22 =====

sql = "SELECT sum(point) AS total (SELECT TOP 5 point FROM point WHERE deltagerId = 42 ORDER BY point DESC)"
Set data = Conn.Execute("total")
Response.Write "Bedste 5 kampe: " & data("total") 6 "<br>"
Avatar billede nielle Nybegynder
01. september 2006 - 19:32 #22
... og et svar :^)
Avatar billede nielle Nybegynder
11. september 2006 - 21:09 #23
Har du kigget på min kode?
Avatar billede nielle Nybegynder
20. september 2006 - 21:20 #24
??
Avatar billede musti776 Nybegynder
14. november 2006 - 12:16 #25
beklager det lange svartid..
Tak for hjælpen..
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