Avatar billede nhoff Nybegynder
21. maj 2008 - 22:00 Der er 8 kommentarer og
1 løsning

Avanceret TOP 3 forespørgsel

Jeg har en tabel (tblLand) med 3 kolonner (land, by, indbyggertal) med følgende eksempeldata:

Land          By          Indtal
Danmark      København  800.000
Norge        Oslo        650.000
Danmark      Roskilde    80.000
Danmark      Aarhus      300.000
Danmark      Kolding      50.000
Norge        Bergen      120.000
.... etc.

Kan jeg lave en forespørgsel der for hvert land viser top 3 største byer i falde rækkefølge?
Avatar billede jensen363 Forsker
22. maj 2008 - 08:40 #1
Mon ikke du kan benytte en UNION til dette :

SELECT TOP 3 tblLand.Land, tblLand.By, tblLand.IndTal FROM tblLand
WHERE (((tblLand.Land)="Danmark"))
ORDER BY tblLand.IndTal DESC;
UNION
SELECT TOP 3 tblLand.Land, tblLand.By, tblLand.IndTal FROM tblLand
WHERE (((tblLand.Land)="Norge"))
ORDER BY tblLand.IndTal DESC;
Avatar billede nhoff Nybegynder
22. maj 2008 - 09:27 #2
Det kunne jeg sagtens, men der er x lande og landenavne varierer fra måned til måned.
Avatar billede jensen363 Forsker
22. maj 2008 - 09:30 #3
Hvordan kan landenavn variere ? ... det er reelt uden betydning, da listen kun medtager lande som findes i dit datasæt
Avatar billede nhoff Nybegynder
22. maj 2008 - 09:49 #4
Indrømmet lidt uklart formuleret.
Nogle måneder er Argentina med på listen, andre måneder er det Marokko eller Tyskland.

Jeg er med på at jeg i princippet kunne lave UNION øvelsen for alle lande. Det har dog den slagside at der jo er hundredevis af lande og dermed bliver det en ganske lang sql-sætning.

Pointen er at jeg helst ville have en forespørgsel, der fungerer uafhængigt af antallet af lande og uden at skulle ændre i forespørgslen hvis der tilføjes et nyt land.
Avatar billede jensen363 Forsker
22. maj 2008 - 10:00 #5
Jeg havde noget lignende får år tilbage, måske kan du benytte dette

http://www.eksperten.dk/spm/580236
Avatar billede jensen363 Forsker
22. maj 2008 - 10:40 #6
Hvis du ikke helt er med på fremgangsmåder, går det ud på, at du har en ekstra tabel, hvori du har alle landene oplistet ( eksempel tblAlleLande ). Derudover har du en tabel hvor du indsætter dine resultater af Top3 ( eksempel tblTop3Lande )

Function tblLandLoop()
Dim strSQL As String
    Dim strSQL1 As String
        Dim strSQL2 As String
            Dim strSQL3 As String

Dim db As DAO.Database
Dim rsttblAlleLande As Recordset

    Set db = CurrentDb()

    strSQL = "INSERT INTO tblTop3Lande ( Land, [By], IndTal ) "
    strSQL = strSQL & "SELECT TOP 3 "
    strSQL = strSQL & "tblLand.Land, "
    strSQL = strSQL & "tblLand.By, "
    strSQL = strSQL & "tblLand.IndTal "
    strSQL = strSQL & "FROM tblLand "
    strSQL = strSQL & "GROUP BY tblLand.Land, tblLand.By, tblLand.IndTal "
    strSQL2 = "ORDER BY tblLand.IndTal DESC;"
       
    Set db = CurrentDb
    Set rsttblAlleLande = db.OpenRecordset("tblAlleLande", dbOpenDynaset)
    Do Until rsttblAlleLande.EOF
        strSQL1 = "HAVING (((tblLand.Land) = """ & rsttblAlleLande!Land & """)) "
        strSQL3 = strSQL & strSQL1 & strSQL2
        db.Execute strSQL3
        rsttblLande.MoveNext
    Loop

End Function
Avatar billede jensen363 Forsker
22. maj 2008 - 10:59 #7
Hvis du ikke helt er med på fremgangsmåder, går det ud på, at du har en ekstra tabel, hvori du har alle landene oplistet ( eksempel tblAlleLande )/alternativt en forespørgsel hvor du dynamisk har landene fra tblLand.
Avatar billede nhoff Nybegynder
22. maj 2008 - 14:06 #8
Jeg er helt med på fremgangsmåden. Jeg har selv lavet denne:

Public Sub Top3Byer()

Dim RS As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT DISTINCT tblLand.Land FROM tblLand ORDER BY Land"

Set RS = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
strSQL = ""
While Not RS.EOF
    If strSQL <> "" Then strSQL = strSQL & " UNION "
    strSQL = strSQL & "SELECT TOP 3 tblLand.Land, tblLand.By, tblLand.Indbyggere FROM tblLand WHERE tblLand.Land = '" & RS.Fields("Land") & "' ORDER BY Indbyggere DESC"
    RS.MoveNext
Wend

CurrentDb.QueryDefs("qry2").SQL = strSQL
CurrentDb.QueryDefs("qry1").SQL = "SELECT qry2.Land, qry2.By, qry2.Indbyggere FROM qry2 ORDER BY qry2.Land, qry2.Indbyggere DESC"

DoCmd.OpenQuery "qry1"

End Sub

Og der lader ikke til at være nogen måde at lave den på, som ikke er programmatisk. Tak for hjælpen alligevel og point for indsats.
Avatar billede jensen363 Forsker
22. maj 2008 - 14:10 #9
Jeg takker
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