Elite Veteran
Beiträge: 868
Ort: Wien | Hallo, Werner!
Nur mit SQL und TOP kommst du da nicht recht weiter. Zum einen, weil du eben die Spitzenwerte für jeden brauchst, zum anderen weil TOP Ränge mehrfach vergibt, wenn es mehrere gleiche Werte gibt.
Für eine genaue Anleitung müsste man deine Tabellen und Felder kennen. Ich gehe in meinem Beispiel mal davon aus, dass du eine Abfrage "qryErgebnisse" hast mit zwei Feldern PersonId und Punkte, aufsteigend sortiert nach PersonId und absteigend nach Punkten. Die Abfrage zeigt also die erste Person beginnend mit ihrem besten Ergebnis, dann ihr zweitbestes Ergebnis usw., danach kommt die nächste Person.
Vorgehen:
Erstelle eine neue (Arbeits-) Tabelle "tblAuswertung" mit 2 Feldern: PersonId und Punkte
Wähle im Ribbon "Erstellen" ganz rechts "Modul" und kopiere folgenden VBA-Code in das neue Modulfenster:
Public Sub procTop()
Dim db As DAO.Database
Dim rsQuelle As DAO.Recordset, rsZiel As DAO.Recordset
Dim lngPId As Long, lngPunkte As Long, i As Long
Set db = CurrentDb
'Zieltabelle leeren
db.Execute "DELETE FROM tblAuswertung"
Set rsQuelle = db.OpenRecordset("qryErgebnisse", dbOpenDynaset)
Set rsZiel = db.OpenRecordset("tblAuswertung", dbOpenDynaset)
Do Until rsQuelle.EOF
If lngPId <> rsQuelle!PId Then
i = 1
lngPId = rsQuelle!PId
lngPunkte = rsQuelle!Punkte
Else
i = i + 1
If i = 2 Then
lngPunkte = lngPunkte + rsQuelle!Punkte
rsZiel.AddNew
rsZiel!PId = lngPId
rsZiel!Punkte = lngPunkte
rsZiel.Update
End If
End If
rsQuelle.MoveNext
Loop
Der Code geht durch alle Datensätze der Abfrage und schreibt die PersonId und die Summe ihrer besten zwei Ergebnisse in die Zieltabelle. Setze den Cursor irgendwo in den Code und drücke die Taste F5 zum Ausführen.
----- Servus
Karl
*********
Access-Entwickler-Konferenz: https://www.donkarl.com/?aek - Jetzt anmelden für 19./20.10. in Nürnberg
Access DevCon Vienna: https://www.donkarl.com/devcon
Access Forever: https://www.accessforever.org
Access News: https://www.youtube.com/playlist?list=PLVCeBbJIMDvdJ8ghMbEakJ6_EQyvy... |