Aus einer SELECT DISTINCT Abfrage möchte ich den Wert schrittweise eines Datensatzes ermitteln
Hallo,
gegeben ist eine Abfrage:
Diese liefert jetzt beispielsweise 7 Treffer:
20028
20092
20107
20174
20357
20472
21095
Ich möchte aber nun die Abfrage so erweitern, dass ich wahlweise das Ergebnis (1-7) herausbekomme. Also sozusagen:
select den 4. Treffer aus der Abfrage eingangs. Ich hab da was über rank() gelesen, bekomme das aber nicht umgesetzt.
Hat jemand eine Idee was ich in die Abfrage noch einbastel (als Variable) um zum Ziel zu kommen?
Danke
gegeben ist eine Abfrage:
select Distinct (KHKKontokorrent.Kto)
FROM KHKAdressen INNER JOIN
KHKKontokorrent ON KHKAdressen.Adresse = KHKKontokorrent.Adresse INNER JOIN
KHKStatVKKunden ON KHKKontokorrent.Kto = KHKStatVKKunden.Kunde
where KHKAdressen.LieferPLZ like '01%' and KHKStatVKKunden.Periode >= '2016001' and KHKStatVKKunden.Periode <= '2016012'
20028
20092
20107
20174
20357
20472
21095
Ich möchte aber nun die Abfrage so erweitern, dass ich wahlweise das Ergebnis (1-7) herausbekomme. Also sozusagen:
select den 4. Treffer aus der Abfrage eingangs. Ich hab da was über rank() gelesen, bekomme das aber nicht umgesetzt.
Hat jemand eine Idee was ich in die Abfrage noch einbastel (als Variable) um zum Ziel zu kommen?
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 316262
Url: https://administrator.de/forum/aus-einer-select-distinct-abfrage-moechte-ich-den-wert-schrittweise-eines-datensatzes-ermitteln-316262.html
Ausgedruckt am: 10.04.2025 um 06:04 Uhr
9 Kommentare
Neuester Kommentar
Hi,
Du möchstest nur den 4. Satz haben, weil ....? Er der größte, kleinste, schönste ist?
Ansonsten mit "select top 4" in eine Temp-Tabelle kippen und diese Temp-Tabelle umgekehrt sortieren, davon der 1. - das wäre der 4. aus der Gesamt-Liste.
Also irgendwie so:
E.
Du möchstest nur den 4. Satz haben, weil ....? Er der größte, kleinste, schönste ist?
Ansonsten mit "select top 4" in eine Temp-Tabelle kippen und diese Temp-Tabelle umgekehrt sortieren, davon der 1. - das wäre der 4. aus der Gesamt-Liste.
Also irgendwie so:
select top 4 * into newtable ...
..
select from newtabel oder by ... DESC
E.
Welcher SQL Server ist das? Bei MS-SQL ginge das hier:
SELECT t.Kto
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY KHKKontokorrent.Kto) AS zeile,
KHKKontokorrent.Kto
FROM KHKAdressen
INNER JOIN KHKKontokorrent
ON KHKAdressen.Adresse = KHKKontokorrent.Adresse
INNER JOIN KHKStatVKKunden
ON KHKKontokorrent.Kto = KHKStatVKKunden.Kunde
WHERE KHKAdressen.LieferPLZ LIKE '01%'
AND KHKStatVKKunden.Periode >= '2016001'
AND KHKStatVKKunden.Periode <= '2016012'
GROUP BY KHKKontokorrent.Kto
) t
WHERE t.zeile <= 4
Moin,
Was hast du denn damit am Ende vor?
Willst du für einen Report/ ein Programm zwischen den Ergebnissen hin und her springen können?
Wenn ja, wäre es unklik, jedesmal ein SQL-Statement dafür auszuführen.
Besser wäre es, einmal das gesamte Query laufen lassen (natürlich nur mit den relevanten Daten -> where-Clause), das Ergebnis in ein Array schreiben und dann durchs Array "zappen".
Ansonsten: siehe emeriks.
Gruß
em-pie
Was hast du denn damit am Ende vor?
Willst du für einen Report/ ein Programm zwischen den Ergebnissen hin und her springen können?
Wenn ja, wäre es unklik, jedesmal ein SQL-Statement dafür auszuführen.
Besser wäre es, einmal das gesamte Query laufen lassen (natürlich nur mit den relevanten Daten -> where-Clause), das Ergebnis in ein Array schreiben und dann durchs Array "zappen".
Ansonsten: siehe emeriks.
Gruß
em-pie
Moin Aximand,
sag uns doch bitte - wie auch ukulele-7 schon gefragt hat , von welchem Datenbankblech wir reden.
Von der Strategie her wären row_number() oder, falls es das nicht gibt, eine selbstgebastelte Rank()-Spalte schon richtig.
Wenn wir vom worst case ausgehen (wir reden von Access), dann ist es halt umständlicher als bei echten Datenbankservern. Aber natürlich auch lösbar.
Grüße
Biber
sag uns doch bitte - wie auch ukulele-7 schon gefragt hat , von welchem Datenbankblech wir reden.
Von der Strategie her wären row_number() oder, falls es das nicht gibt, eine selbstgebastelte Rank()-Spalte schon richtig.
Wenn wir vom worst case ausgehen (wir reden von Access), dann ist es halt umständlicher als bei echten Datenbankservern. Aber natürlich auch lösbar.
Grüße
Biber
Moin Aximand,
das hat ukulele-7 doch prinzipiell gezeigt-
Du musst schrittweise mehrere SELECTs verschachteln.
Als innerstes SELECT dein "SELECT DISTINCT KHKKontokorrent.Kto WHERE..".
Oder mit GROUP BY statt DISTINCT , egal
Zweites SELECT drumherum "SELECT kto, ROW_NUMBER OVER (...) as rn FROM (inneres SQL)"
Äußeres SELECT ist dann "SELECT kto FROM (zweites SELECT) WHERE rn =4"
Bau es so schrittweise auf, von innen nach aussen.
Grüße
Biber
[Edit] Upps, da wurde ich wohl überholt..[/Edit]
das hat ukulele-7 doch prinzipiell gezeigt-
Du musst schrittweise mehrere SELECTs verschachteln.
Als innerstes SELECT dein "SELECT DISTINCT KHKKontokorrent.Kto WHERE..".
Oder mit GROUP BY statt DISTINCT , egal
Zweites SELECT drumherum "SELECT kto, ROW_NUMBER OVER (...) as rn FROM (inneres SQL)"
Äußeres SELECT ist dann "SELECT kto FROM (zweites SELECT) WHERE rn =4"
Bau es so schrittweise auf, von innen nach aussen.
Grüße
Biber
[Edit] Upps, da wurde ich wohl überholt..[/Edit]