21. maj 2008 - 22:00Der 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?
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;
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.
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
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.
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.
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.