Avatar billede mite Nybegynder
06. juli 2005 - 15:01 Der er 13 kommentarer og
1 løsning

Forespørgsel med max. antal fra en bestemt tabel

Jeg har en masse data i en tabel med 4 felter.
Felt1=navn
Felt2=rækkeID (indeholder data med et tal fra 1-30)
Felt3=dreng/pige
Felt4=point

Jeg har behov for at få følgende udtræk:
Jeg skal have fundet de 10 bedste navne (dem med flest point)
Der må max. være 3 fra hver række uanset om det er dreng/pige
Der skal være 6 drenge og 4 piger

Håber der er nogen derude der kan hjælpe mig.
Avatar billede terry Ekspert
06. juli 2005 - 15:46 #1
Der må max. være 3 fra hver række uanset om det er dreng/pige

can you explain what you mena by this please?
Avatar billede mugs Novice
06. juli 2005 - 16:32 #2
... og dog skal der være 6 drenge og 4 piger?
Avatar billede mite Nybegynder
06. juli 2005 - 18:34 #3
Okay...jeg har en tabel med følgende felter:
Felt1=navn
Felt2=rækkeID (indeholder data med et tal fra 1-30)
Felt3=dreng eller pige
Felt4=point

Følgende er data:
Felt1    Felt2    Felt3    Felt4
test1    1        d        205
test1    2        d        143
test1    2        d        54
test1    1        p        98
test1    3        d        132
test1    1        p        176
test1    4        d        199
test1    4        p        43
test1    3        p        23
test1    2        d        76
test1    2        p        125
test1    3        d        200
test1    3        p        148
test1    3        d        122
test1    1        d        99
test1    4        p        75
test1    2        d        187
test1    3        p        145
test1    1        p        65
test1    4        d        98
test1    1        d        158

Herfra skal jeg har lavet en forspørgsel som indeholde 10 navne hvoraf:
6 dreng/pige=d fra felt3
4 dreng/pige=p fra felt3
Ud af de 10 navne må der max være 3 fra hver rækkeID fra felt2.
Der skal findes de 10 navne som overholder ovennævnte krav samt at de skal have det højeste antal point.

Håber det er til at forstå.
Avatar billede terry Ekspert
06. juli 2005 - 19:57 #4
I'm no expert at SQL but I think I can safely say that I very much doubt that it is possible using only SQL.
Avatar billede mite Nybegynder
06. juli 2005 - 21:18 #5
terry> Har du nogen ideer til hvordan jeg skal gribe det an?
Avatar billede terry Ekspert
06. juli 2005 - 22:10 #6
This is just a VERY wild guess, and it will very likley need some changes.

You will need a TEMP table to contain those you choose. Also I am assuming that felt1 (navn) is a unique key (primary key)

make a select on the original table sorting by felt4 (point) desc (descending) so that you get the highest first. Now you have a recordset which you can loop through taking one record at a time and adding it to the TEMP table.

Before you add it to the TEMP table you have to make sure that.

1: It doesnt already exist.
2: There are less than 6 boys (if the record you want to add is a boy)
3: There are less than 4 girls (if the record you want to add is a girl)
4: There are less than 3 records with the same "rækkeID" (felt2)
5: There are less than 10 records. (if not then you are finished.

So for each of the 5 points above you will need to make a select to see if you can or can not add the record, and in the case of 5, finish.

Hope that makes sence :o)
Avatar billede terry Ekspert
06. juli 2005 - 22:13 #7
The order of 1 to 5 will need changing I think.

Maybe
5:
4:
1:
2:
3:
Avatar billede Slettet bruger
07. juli 2005 - 11:11 #8
Det ser lidt kringlet ud.... Faktisk tror jeg ikke det kan lade sig gøre, for hvad nu hvis de 3 bedste drenge og den bedste pige er i samme række, hvem skal så
snydes?~) Når man holder sådan nogle arrangementer, så skal der en person til at afgøre hvad er mest retfærdigt, det kan man ikke få et program til!~) (eller kan man...)

Hvis du ikke få en eller anden super sql udleveret, så kan du måske bruge følgende fremgangsmåde:

* Du tilføjer et ja/nej felt i din tabel.
* Du laver en vindertabel med navn, dreng/pige og point
* Når stævnet er færdigt, så åbner du en formular. På denne formular har du en liste for drengene og en for pigerne, dem med højest point står øverst.
* Derudover har du en liste for hver række, med plads til 3 poster. Forespørgslen til kilden laves ud fra vindertabellen
* Når du så dobbeltklikker på en af listerne for enten drenge eller piger, så kør nogle forespørgsler (eller hvordan du nu foretrækker det), som:
1. Sætter postens ja/nej felt til ja
2. skriver posten i vindertabellen
3. opdaterer listerne
* I listerne for de enkelte rækker, skal man kunne dobbeltklikke for den modsatte effekt, så man kan fjerne et navn igen
* Du kan så lave en summeringsfelt for piger og et for drenge, for at holde øje med fordelingen. Fordelingen på rækker kan jo ses rent fysisk

Med de sportsligste hilsner!~)
Avatar billede Slettet bruger
07. juli 2005 - 11:13 #9
Det med ja/nej feltet er selvfølgelig for at kunne fjerne personen fra drenge eller pige listen, så du ikke vælger den samme 2 gange.
Avatar billede mite Nybegynder
07. juli 2005 - 13:39 #10
spg> Jeg har fulgt terrys råd og det virker. Jeg får det resultat som jeg skal have.
Turneringen foregår således, at man kan oprette sig som manager. Som manager kan man lave en masse hold. Hvert hold skal bestå af 10 spillere heraf 6 drenge og 4 piger med kun max. 3 fra hver række(årgang).
Den liste på 10 spillere jeg skal have i det her udtræk er det bedste hold der kan laves overhovedet...holdet skal jo også overholde reglerne, så der er ingen der bliver snydt.

Så terry...gider du lægge et svar.
Avatar billede Slettet bruger
07. juli 2005 - 13:59 #11
Okey, nu forstår jeg hvad det er du vil!~)
Avatar billede terry Ekspert
07. juli 2005 - 14:35 #12
Glad to hear the idea worked.
Any chance of seeing the code?
Avatar billede mite Nybegynder
07. juli 2005 - 16:25 #13
Koden ser således ud:

<%
'Variabler
drenge=6
piger=4
raekke=3
antal=10

Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & Server.MapPath("db.mdb")
Conn.Open DSN

SQLslet = "DELETE * FROM TEMP"
Conn.Execute(SQLslet)

SQL = "SELECT Tabel.[navn], Tabel.[raekke], Tabel.[sex], Tabel.[point] FROM TABEL ORDER BY Tabel.[point] DESC;"
Set rs = Conn.Execute(SQL)

'response.write "<table>"

if not rs.BOF AND NOT rs.EOF then
    rs.movefirst

    Do while not rs.eof
        navn=rs("navn")
        raekkeID=rs("raekke")
        sex=rs("sex")
        point=rs("point")
   
        'Tæller antal navne i række
        SQL4 = "SELECT Count(raekke) as Araekke FROM TEMP WHERE raekke="&raekkeID
        set rsAraekke = conn.Execute(SQL4)
        Araekke = rsAraekke("Araekke")+1


        If Aspillere<antal then
            If sex="d" then
                If Adrenge<drenge then
                    If Araekke<=raekke then

                        SQL = "INSERT INTO TEMP (navn,raekke,sex,point) VALUES ('" & navn & "','" & raekkeID & "','" & sex & "','" & point & "')"
                        conn.Execute(SQL)

                        'Tæller antal drenge
                        test="d"
                        SQL2 = "SELECT Count(sex) as Adrenge FROM TEMP WHERE sex='"&test&"'"
                        set rsAdrenge = conn.Execute(SQL2)
                        Adrenge = rsAdrenge("Adrenge")

                        'Tæller antal piger
                        test="p"
                        SQL3 = "SELECT Count(sex) as Apiger FROM TEMP WHERE sex='"&test&"'"
                        set rsApiger = conn.Execute(SQL3)
                        Apiger = rsApiger("Apiger")

                        'Tæller antal spillere
                        SQL1 = "SELECT Count(navn) as Aspillere FROM TEMP"
                        set rsAspillere = conn.Execute(SQL1)
                        Aspillere = rsAspillere("Aspillere")

                        topholdet = topholdet & "<tr><td><font size=2 face=arial>" & navn & "</font></td><td><font size=2 face=arial> - " & raekkeID & "</font></td><td><font size=2 face=arial> - " & sex & "</font></td><td><font size=2 face=arial> - " & point & "</font></td></tr>"
                    end if       
                end if
            end if

            if sex="p" then
                IF Apiger<piger then
                    If Araekke<=raekke then

                        SQL = "INSERT INTO TEMP (navn,raekke,sex,point) VALUES ('" & navn & "','" & raekkeID & "','" & sex & "','" & point & "')"
                        conn.Execute(SQL)

                        'Tæller antal drenge
                        test="d"
                        SQL2 = "SELECT Count(sex) as Adrenge FROM TEMP WHERE sex='"&test&"'"
                        set rsAdrenge = conn.Execute(SQL2)
                        Adrenge = rsAdrenge("Adrenge")

                        'Tæller antal piger
                        test="p"
                        SQL3 = "SELECT Count(sex) as Apiger FROM TEMP WHERE sex='"&test&"'"
                        set rsApiger = conn.Execute(SQL3)
                        Apiger = rsApiger("Apiger")

                        'Tæller antal spillere
                        SQL1 = "SELECT Count(navn) as Aspillere FROM TEMP"
                        set rsAspillere = conn.Execute(SQL1)
                        Aspillere = rsAspillere("Aspillere")

                        topholdet = topholdet & "<tr><td><font size=2 face=arial>" & navn & "</font></td><td><font size=2 face=arial> - " & raekkeID & "</font></td><td><font size=2 face=arial> - " & sex & "</font></td><td><font size=2 face=arial> - " & point & "</font></td></tr>"
                    end if
                end if                   
            end if
        end if
    rs.movenext
    loop

end if

response.write "<table>"&topholdet&"</table>"

response.write "<br>Antal: " & Aspillere & "<br>"
response.write "Drenge: " & Adrenge & "<br>"
response.write "Piger: " & Apiger & "<br>"

conn.close
set conn = nothing
set rs = nothing
set rsApiger = nothing
set rsAspillere = nothing
set rsAdrenge = nothing
set rsAraekke = nothing
%>
Avatar billede terry Ekspert
07. juli 2005 - 19:53 #14
Looks OK

og mange tak
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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