-
SQL - Höchsten Datumswert eines Kunden anzeigen lassen
Servus,
ich möchte aus einer Kundendatei pro Kunde den höchsten Datumswert anzeigen lassen.
Kunde kann mehrere Einträge haben. GADAT ist "gültig ab" Datumsfeld.
Bei dem Bsp. bekomme ich das ja noch hin mit Max(GADAT) und GROUP auf Kdnr.
Was mache ich aber wenn ich noch die ganzen Adressdaten(Name2, Str, Plz und Ort) mit
anzeigen lassen möchte?
Bsp.
Kdnr |
GADAT |
701350 |
2008/07 |
701350 |
2010/12 |
701350 |
|
701450 |
2012/05 |
701450 |
2017/01 |
|
|
-
... wenn denn Deine Kdnr primary key ist, kannst Du einfach max(xxx) oder MIN(xxx) nehmen.
D*B
-
Sofern im Datensatz noch andere Informationen enthalten sind, die Du sehen willst ...
Ermittle die eindeutigen Schlüssel-Daten und das höchste Datum in einer CTE (Common Table Expression) oder verschachtelten Select-Anweisung und verknüpfe das Ergebnis über den Unique Key (z.B. Kunden-Nr.) und das Datum mit dem eigentlichen Datensatz.
Bei einen zusammengesetzten Schlüssel, musst Du natürlich auf diesen zusammengesetzten Schlüssel verdichten.
Code:
With x as (Select KundeNr, Max(GueltDat) MaxDat
From YourTable
Where ....
Group By KundeNr)
Select a.*
From x join YourTable a on x.KundeNr = a.KundeNr and MaxDat = GueltDat
...
Birgitta
-
Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:
select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...
Wenn ich einen Join vermeiden kann, lass ich es auch.
-
Und wenn ein Kunde umzieht?
Zitat von Fuerchau
Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:
select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...
Wenn ich einen Join vermeiden kann, lass ich es auch.
-
Zitat von Fuerchau
Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:
select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...
Wenn ich einen Join vermeiden kann, lass ich es auch.
Ich denke nicht, dass diese Abfrage das gewünschte Ergebnis zurückbringt.
Beispiel:
Kunde = 1000, GueltDat = 2016-10-20, F1 = X, F2 = C
Kunde = 1000, GueltDat = 2016-10-15, F1 = Z, F2 = W
Kunde = 1000, GueltDat = 2016-10-10, F1 = A, F2 = Z
Dein Beispiel würde folgendes zurück bringen:
Kunde = 1000, GueltDat = 2016-10-20, F1 = Z, F2 = Z
Gewünchst war aber:
Kunde = 1000, GueltDat = 2016-10-20, F1 = X, F2 = C
Birgitta
-
Du musst du Leute nicht immer mit Abstraktion verwirren:
"Was mache ich aber wenn ich noch die ganzen Adressdaten(Name2, Str, Plz und Ort) mit
anzeigen lassen möchte?"
Mein Verständnis hier ist einfach, dass diese Daten sich beim Kunden nicht ändern, daher reicht Dieters Lösung.
Hinzu käme bei einer Normalisierung eigentlich ein Join auf den Kundenstamm ohne Datumsbezug und dann reicht auch ein MIN(KDST.Name).
-
... am elegantesten wäre es ohnehin neben gültig ab noch gültig bis mit hinzu zu nehmen und beim letzten Higval reinzuschreiben. Wird ein neuer angelegt, muss der alte terminiert werden und ein neuer eingefügt werden (am besten mit Trigger), dann kann man für jedes beliebige Datum mit between den gültigen fischen. Diese Variante ist auch von der Performance bei weitem die Beste, da nur ein Satz gelesen werden muss.
D*B
-
Hallo *all,
ich möchte das Thema nochmals aufgreifen:
Ich habe eine Adressdatei und dazu die Auftragsdaten.
Ich möchte jetzt jeweils zu dem Kunden den Satz mit dem höchsten Auftragsdatum haben.
Code:
with x as (select akkto, max(akkdn1) Datum from kndauf
group by akkto)
select t01.adkto, Datum
from x join adr01pf t01 on x.akkto = t01.adkto
Dummerweise bekomme ich jetzt aber folgendes Angezeigt:
Code:
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
Sprich für jeden Satz in der Auftragsdatei zeigt er mir das höchste Datum an. Ich will es aber nur einmal pro Kunde haben.
Wo ist mein Denkfehler?
GG 4847
-
Nimm in den Join noch das Datum als Bezug auf. Schließlich ist das ja dieser Satz.
Sollttest du allerdings mehr als 1 Auftrag für einen Tag haben so musst du ggf. noch den letzten Auftrag dazunehmen.
-
Versteh ich jetzt nicht wie da die Syntax sein soll.
GG 4847
-
with x as (select akkto, max(akkdn1) Datum from kndauf
group by akkto)
select t01.adkto, Datum
from x join adr01pf t01 on x.akkto = t01.adkto and x.datum = t01.akkdn1
Wenn du nur mit dem Konto verknüpfst, bekommst du halt wieder jeden Satz.
Similar Threads
-
By Kirsten Steer in forum Archiv NEWSboard Events
Antworten: 0
Letzter Beitrag: 02-09-02, 10:25
-
By Koelch400 in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 15-08-02, 09:53
-
By RM Haaßengier in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 04-06-02, 13:04
-
By delphix in forum IBM i Hauptforum
Antworten: 10
Letzter Beitrag: 23-01-02, 14:02
-
By RM Haaßengier in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 22-10-01, 11:18
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks