Ich möchten Datensätze in einer Abfrage fortlaufend innerhalb der Gruppe nummerieren. Dies möchte ich gerne als SQL-Text in einer Unterabfrage erreichen.
Hier die Angaben:
Tabelle: Scores
Felder, welche einbezogen werden müssen.
Nach diesem Feld soll Gruppiert werden:
[Link_Team_number] (Zahl)
Diese Felder sollen zur Sortierung mit eingebunden werden:
1. [Rank_Field] (Zahl) aufsteigend sortiert
2. [Total] (Zahl) absteigend sortiert
3. [Arrange] (Zahl) absteigend sortiert
Kriterium
[Rangiert] (ja/nein) = ja
Das Resultat sollte so aussehen, dass für die gleiche Team-Nummer eine laufende Nummer generiert wird. Immer beginnend mit der Nummer 1.
Für die Vorgabe vom SQL-Text wäre ich enorm dankbar :)
Vielen Dank
Alain
ZitatDiese Felder sollen zur Sortierung mit eingebunden werden:
1. [Rank_Field] (Zahl) aufsteigend sortiert
2. [Total] (Zahl) absteigend sortiert
3. [Arrange] (Zahl) absteigend sortiert
Aus diesen Feldern müsstest Du einen berechneten Ausdruck erzeugen, der pro Datensatz eindeutig ist und eine gewünschte Gesamtsortierung ermöglicht. Das ist gerade bei den absteigenden Einzelsortierungen im Detail anspruchsvoll, weil abhängig von vorhandenen Werten und Datentypen. Beispiel für eine dreistellige Ganzzahl:
irgendwas &/+ (1000-Zahl) &/+ irgendwasAnsonsten orientierst Du Dich an Laufende Nummer/Summe in Abfragen (http://www.donkarl.com?FAQ3.11), wobei der angesprochene Gesamtausdruck die im Link verwendete ID ersetzt. Die gewünschte Gruppierung wird über eine zusätzliche Verknüpfung von Haupt- und Unterabfrage über das entsprechende Feld erzeugt.
Generell: Die Berechnung von laufenden Nummern ist aufwändig. Der benötigte Zeitaufwand steigt überproportional zur Datensatzmenge an, weil die Unterabfrage pro Datensatz ausgeführt werden muss und zusätzlich das interne Zählen auf der Datenmenge beruht. Durch den berechneten Gesamtwert entfällt dann zusätzlich eine Indexnutzung beim Vergleich.
Daher sollte man besser die verwendeten Datenmengen frühzeitig begrenzen oder im besseren Fall auf solche Maßnahmen ganz verzichten.
MfGA
ebs
Vielen Dank ebs für die ausführliche Antwort :)
Ich möchte aber trotzdem gerne meinen Code, welchen ich aus einer früheren Anfrage etwas angepasst habe, nachstehend aufzeigen. Diese
Nummerierung funktioniert bis auf den Fehler, dass alle Felder absteigend sortiert werden. Einzig das Feld [Rank_Field] sollte aber aufsteigend sortiert sein. Eventuell gibt es dazu eine Lösung.
Nummerierung: (SELECT Count(*) FROM Scores AS X WHERE Format(X.Link_team_number,"000") & ";" & Format(X.Rank_Field,"000") & ";" & Format(X.Total,"000") & ";" & Format(X.Arrange,"000") > Format(T.Link_team_number,"000")& ";" & Format(T.Rank_Field,"000") & ";" & Format(T.Total,"000") & ";" & Format(T.Arrange,"000") AND X.Link_team_number = T.Link_team_number AND X.Rangiert = True)+1
Nochmals vielen Dank für Deine Hilfe.
Gruss Alain |
ZitatFormat(X.Link_team_number,"000") & ";" & Format(X.Rank_Field,"000") & ";" & Format(X.Total,"000") & ";" & Format(X.Arrange,"000")
Na also, einen solchen von mir geschilderten Gesamtausdruck erzeugst Du ja schon, und meine Spekulation auf dreistellige Zahlen ist recht zutreffend. Damit werden die Korrekturen im übersichtlichen Rahmen bleiben:
Format(1000-X.Rank_Field,"000") & ";" & Format(1000-X.Total,"000") & ";" & Format(X.Arrange,"000")Das Ganze für den T-Anteil genau so, und der Rest bleibt identisch.
Varianten:
- Derzeit wird ein String erzeugt durch die Textverkettung. Zahlen sind für Computer einfacher und somit schneller verarbeitbar:
X.Rank_Field + (1000 - X.Total) / 1000 + (1000 - X.Arrange) / 1000000- Wie im Link vermerkt könnte ein DCount evtl. schneller laufen als die vergleichbare Unterabfrage (obwohl mir richtiges SQL auch eher liegt). Also solltest Du testen, ob sich damit eine Laufzeitverbesserung ergibt.
MfGA
ebs
Super, funktioniert einwandfrei :) :) :)
Vielen herzlichen Dank für Deine Hilfe.
Ich habe die erste Variante gewählt. Für mein Projekt ist die Geschwindigkeit ausreichend. Die Abfrage wird ohne Zeitverzögerung geöffnet.
Beste Grüsse
Alain