ceyxremains
Goto Top

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:
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.

Content-Key: 588179

Url: https://administrator.de/contentid/588179

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: em-pie
Lösung em-pie 16.07.2020 aktualisiert um 12:55:25 Uhr
Goto Top
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
  • 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 face-wink

Gruß
em-pie
Mitglied: CeyxRemains
CeyxRemains 16.07.2020 um 13:10:59 Uhr
Goto Top
Hallo em-pie,

danke für den Hinweis. Stimmt wenn man es sich selbst erarbeitet, bleibt sicher mehr hängen. Dann starte ich gleich mal mit der Recherche zu den inner joins
Mitglied: GrueneSosseMitSpeck
GrueneSosseMitSpeck 16.07.2020 um 15:52:17 Uhr
Goto Top
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.
Mitglied: CeyxRemains
CeyxRemains 16.07.2020 um 17:00:28 Uhr
Goto Top
Hallo,

@GrueneSosseMitSpeck: Danke für den Hinweis. Ja es handelt sich um den Typ Datetime

Ich hab jetzt versucht die Abfrage mit den Inner Joins umzusetzen:

SELECT
	a.adrlfdnr, 
	k.kondatum,
	v.verkuerzel

FROM
	(
		(
			kontakte k 
		inner join 
			vertreter v
		on k.konverlfdnr = v.verlfdnr
		) 
	inner join
		adressen a 
	on k.konadrlfdnr = a.adrlfdnr
	)
inner join 
	merkmale m
on a.adrlfdnr = m.meradrlfdnr

where v.verkostenstelle = 100056553 and
	mername = 'OEM'  

Somit erhalte ich für die Adressen mit dem Merkmal 'OEM' alle Kontakte jener Vertreter die sich in der VerGruppe 100056553 befinden.

Wie schaffe ich es jetzt für jede Adresse das größte Datum + den entsprechenden Vertreter auszugeben? Wenn ich
max(a.adrlfdnr)
schreibe, muss ich adrlfdnr und verkuerzel gruppieren und erhalte somit nur den größten Kontakt pro Adresse und pro Vertreter...

Danke für eure Geduld
Mitglied: CeyxRemains
CeyxRemains 27.07.2020 um 16:07:12 Uhr
Goto Top
Hallo zusammen,

könnt ihr mir hierzu schon weiterhelfen?

Danke für die Unterstützung
Mitglied: MadMax
MadMax 27.07.2020 um 19:34:42 Uhr
Goto Top
Hallo CeyxRemains,

in Deiner Aufgabenstellung kann ich nirgends entdecken, daß Du auch Vertreterdaten ausgeben sollst. Nur das größte Datum zur Adresse. Wenn Du also nur nach den Adressdaten gruppierst und das größte Datum holst, hast Du Dein Ergebnis.

Gruß, Mad Max
Mitglied: CeyxRemains
CeyxRemains 27.07.2020 um 22:39:51 Uhr
Goto Top
Hallo Mad Max,

danke für deinen Post. Du hast Recht, ich habe im Eingangsthread nichts davon geschrieben, dass ich Vertreterdaten ausgeben möchte. Beim Herumprobieren ist mir aber aufgefallen, dass ich scheinbar die Logik der SQL-Abfragen noch nicht richtig durchschaut hab.

Wenn ich zusätzlich Vertreterdaten ausgeben möchte, muss ich doch das Ergebnis meiner bestehenden SQL Abfrage (siehe oben) wie eine Tabelle verwenden, oder? Leider versteh ich aber noch nicht wie ich das anstellen soll.

Zur Erklärung: Hier handelt es sich um eine Aufgabenstellung, die sich weiter aufbaut...

Gruß, CeyxRemains
Mitglied: MadMax
Lösung MadMax 28.07.2020 um 00:52:22 Uhr
Goto Top
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:
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
Mitglied: CeyxRemains
CeyxRemains 31.07.2020 um 12:03:00 Uhr
Goto Top
Hallo MaxMax,

vielen Dank für deine Hilfe. Für mich reicht der erste Vorschlag. Damit hat es super funktioniert.

Ich werde mir aber "cross apply" für zukünftige Abfragen etwas genauer ansehen.

Danke an alle die mich hier unterstützt haben face-smile

Gruß, CeyxRemains