SQL Abfrage in MS SQL-Server
Hallo zusammen,
ich habe ein Problem bei dem ich leider nicht weiterkomme.
Folgende Tabellen existieren
Vertreter:
VerLfdnr | VerName | VerKostenstelle | VerKuerzel | ...
Adresse: (entspricht einem Unternehmen)
AdrLfdnr | AdrName | ...
Merkmale:
MerLfdnr | MerAdrLfdnr | MerBezeichnung | ...
Kontakte: (entspricht einer Korrespondenz, zB Telefonat)
KonLfdnr | KonAdrLfdnr | KonDatum | KonVerLfdnr | ...
Die Aufgabenstellung lautet wie folgt:
Gib von allen Adressen die das Merkmal = 'OEM' besitzen jeweils das größte Datum aus, bei dem der Vertreter die VerGruppe = 100056553 hat.
Folgendes hab ich selbst schon geschafft:
Folgendes passt aber noch nicht:
Evtl. könnt ihr mir helfen. Vielen Dank schon mal im Voraus für eure Bemühungen.
ich habe ein Problem bei dem ich leider nicht weiterkomme.
Folgende Tabellen existieren
Vertreter:
VerLfdnr | VerName | VerKostenstelle | VerKuerzel | ...
Adresse: (entspricht einem Unternehmen)
AdrLfdnr | AdrName | ...
Merkmale:
MerLfdnr | MerAdrLfdnr | MerBezeichnung | ...
Kontakte: (entspricht einer Korrespondenz, zB Telefonat)
KonLfdnr | KonAdrLfdnr | KonDatum | KonVerLfdnr | ...
Die Aufgabenstellung lautet wie folgt:
Gib von allen Adressen die das Merkmal = 'OEM' besitzen jeweils das größte Datum aus, bei dem der Vertreter die VerGruppe = 100056553 hat.
Folgendes hab ich selbst schon geschafft:
Select max(k.kondatum), a.adrlfdnr, v.verkuerzel
FROM kontakte as k, adressen as a, vertreter as v
where k.konverlfdnr in (select verlfdnr
from vertreter
where verkostenstelle = 100056553) and
a.adrlfdnr = k.konadrlfdnr and
v.verlfdnr = k.konverlfdnr
group by adrlfdnr, v.verkuerzel
Folgendes passt aber noch nicht:
- für jeden Vertreter das größte Datum pro Adresse ausgegeben
- Merkmale werden noch nicht berücksichtigt
Evtl. könnt ihr mir helfen. Vielen Dank schon mal im Voraus für eure Bemühungen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 588179
Url: https://administrator.de/contentid/588179
Ausgedruckt am: 25.11.2024 um 03:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
klingt nach einer Schul-/ Hausaufgabe!?
Daher mal nur ein Impuls für weitere Recherchen:
Beschäftige dich mal mit JOINS, in deinem Fall INNER JOIN.
Was du machen musst:
Du startest mit der Tabelle Kontakte
Hier joinst du die Tabellen
Jetzt fängst du mit dem richtigen Group By an
Dein Select dann entsprechend aufbauen.
Ich könnte dir jetzt auch direkt alles fertig schreiben, aber da bleibt weniger hängen
Gruß
em-pie
klingt nach einer Schul-/ Hausaufgabe!?
Daher mal nur ein Impuls für weitere Recherchen:
Beschäftige dich mal mit JOINS, in deinem Fall INNER JOIN.
Was du machen musst:
Du startest mit der Tabelle Kontakte
Hier joinst du die Tabellen
- Vertreter via VerLfdnr
- Adresse via AdrLfdnr
- Diese Tabelle wird noch mit der Tabelle Merkmale via MerAdrLfnr gejoint
Jetzt fängst du mit dem richtigen Group By an
Dein Select dann entsprechend aufbauen.
Ich könnte dir jetzt auch direkt alles fertig schreiben, aber da bleibt weniger hängen
Gruß
em-pie
achtung mit Datumsformaten... wenn die Spalte vom Typ Datetime ist dann geht das max(kondatum), sollte das Datum aber als String hinterlegt worden sein, dann mußt du das noch nach Datetime casten damit das Max() sinnvolle Ergebnisse liefert. Ein Max auf Strings angewendet liefert nur dann korrekte Resultate wenn das Datum als YYYY-mm-dd hinterlegt ist, alles andere führt nur zu Murks.
Hallo CeyxRemains,
wenn Du zusätzlich Vertreterdaten ausgeben willst, hast Du zwei Möglichkeiten:
1. Du nimmst die Abfrage wie ich Dir oben gesagt habe (ohne Vertreterdaten) und liest dann die Vertreter datensatzweise extra dazu. Das ist aber nur halbwegs sinnvoll, wenn Du nur eine Information vom Vertreter willst:
2. Du holst Dir Adressen und Merkmale und liest Dir mit einem "cross apply (select top (1) ... order by kondatum desc)" Vertreter und Kontakte dazu.
Die bessere Methode ist die 2., les mal das "cross apply" nach.
Sobald Du aber Vertreterdaten dazuliest, hast Du aber das Problem, daß möglicherweise mehrere Vertreter dieses letzte Kontaktdatum haben. Mit den beiden obigen Methoden holst Du die Informationen von einem davon dazu. So wie es oben steht ist das dann zufällig, welcher Vertreter geholt wird, mit einem zusätzlichen Sortierkriterium (z.B. verkuerzel) könntest Du steuern, welcher es ist.
Gruß, Mad Max
wenn Du zusätzlich Vertreterdaten ausgeben willst, hast Du zwei Möglichkeiten:
1. Du nimmst die Abfrage wie ich Dir oben gesagt habe (ohne Vertreterdaten) und liest dann die Vertreter datensatzweise extra dazu. Das ist aber nur halbwegs sinnvoll, wenn Du nur eine Information vom Vertreter willst:
select ...,
(select top (1) vi.verkuerzel from Vertreter vi join Kontakte ki on ... where ki.kondatum = k.kondatum) as verkuerzel
from ...
where ...
2. Du holst Dir Adressen und Merkmale und liest Dir mit einem "cross apply (select top (1) ... order by kondatum desc)" Vertreter und Kontakte dazu.
Die bessere Methode ist die 2., les mal das "cross apply" nach.
Sobald Du aber Vertreterdaten dazuliest, hast Du aber das Problem, daß möglicherweise mehrere Vertreter dieses letzte Kontaktdatum haben. Mit den beiden obigen Methoden holst Du die Informationen von einem davon dazu. So wie es oben steht ist das dann zufällig, welcher Vertreter geholt wird, mit einem zusätzlichen Sortierkriterium (z.B. verkuerzel) könntest Du steuern, welcher es ist.
Gruß, Mad Max