Bin etwas verzweifelt und komme nicht weiter:
ich habe eine Tabelle tblPerson mit tblPerson.LastName und eine Tabelle tblTitle mit tblTitle.TitleBrief (diese enthält eine Liste mit akademischen Titeln). Im Personenfeld sind Namen mit akademischem Titel enthalten, z.B. Dr. med. Markus Meier - ich möchte nun den akademischen Titel automatisch extrahieren, und diesen in einer separaten Spalte anzeigen, also nur: Dr. med. - Problem: wenn ich einfach nur "Links" vergleiche, kriege ich mehrere Ergebnisse, nämlich z.B. Dr. med., Dr., und Dr
Gedankengang: ich vergleiche den Linken Teil des STrings und nehme dann das Ergebnis mit der höchsten Länge des akademischen Titels (Len).
Soweit bin ich gekommen:
SELECT tblPerson.LastName, IIf(Left([LastName],[tblTitle.Len]) Like Left([TitleBrief],[tblTitle.Len]),[TitleBrief]) AS Result, tblPerson.PersonID
FROM tblPerson, tblTitle
WHERE (((tblPerson.LastName)="Dr. med. Olav Hagemann") AND ((IIf(Left([LastName],[tblTitle.Len]) Like Left([TitleBrief],[tblTitle.Len]),[TitleBrief])) Is Not Null))
ORDER BY tblTitle.Len DESC;
PersonID LastName Result Len
1259959 Dr. med. Olav Hagemann Dr. med. 8
1259959 Dr. med. Olav Hagemann Dr. 3
1259959 Dr. med. Olav Hagemann Dr 2
das Problem ist, dass er mir jetzt immer alle Ergebnisse anzeigt (also wie oben z.B. 3 Zeilen pro Person), ODER (wenn ich OberstenWert/Max auswähle nur den einen Längenwert, sobald ich andere Spalten hinzufüge, erscheinen wieder mehrere Zeilen pro Person.
Ich brauche als Ergebnis folgendes:
tblPerson.PersonID LastName tblTitle.TitleBrief Len
1259959 Dr. med. Olav Hagemann Dr. med. 8
und dann die nächste Person ...
Jemand eine Idee???
Zitat von: Anke_71 am Dezember 19, 2023, 05:51:54Ich brauche als Ergebnis folgendes:
tblPerson.PersonID LastName tblTitle.TitleBrief Len
1259959 Dr. med. Olav Hagemann Dr. med. 8
und dann die nächste Person ...
Erklär mal welchen Sinn das ganze hat?
Geht es rein darum korrekt zu normalisieren?
Normalerweise würde man in tblPerson eine Spalte mit der Titel_ID mit entsprechender Beziehung zur Titel Tabelle erwarten.
Also klär mal etwas auf, bevor man versucht eine Lösung zu finden.
Ich verstehe die ganze Problematik auch nicht wirklich. Das sieht insgesamt so aus, als wäre fehlende Normalisierung (hier die Aufteilung des kompletten Namens in atomare Bestandteile) die Wurzel des Übels. Die langfristig beste Lösung wäre sicherlich diese Probleme im Datenmodell zu beheben.
Eine Lösung mit deinem bestehenden Ansatz könnte funktionieren, wenn du in einer weiteren Abfrage, analog zu der oben gezeigte Abfrage, die PersonId als Gruppierung und die Maximale Länge des Titels ermittelst. Dann kannst du beide Abfragen über PersonId und Länge verknüpfen.
Meine erste Idee wäre, die Verwirrung runterzufahren.
Ein Feld LastName mit "Dr. med. Olav Hagemann", also mit Vorname und Titel, wirft in Dir keine Zweifel auf?
Hi, hier die Erklärung, wie von markusxy vermutet: wir möchten normalisieren! die Daten werden von extern übernommen, und kommen im Format an: Akademischer Titel Vorname Nachname (in grösseren Mengen, zB 500 Datensätze pro Tag). Derzeit normalisieren wir die Daten dann täglich manuell auf die drei Spalten Title, Vorname, Nachname. Ziel ist, diese Normalisierung so weit wie irgend möglich zu automatisieren, d.h. wenn man den akademischen Titel bereits automatisch abspalten könnte, würde das jeden Tag manuelle Arbeitszeit einsparen. Man könnte die Normalisierung natürlich auch ganz am Anfang bei der Eingabe dem Nutzer überlassen, dieses ist allerdings die Methode, die am meisten Zeit benötigt, da der Eingeber dann drei Werte einzeln einkopieren bzw. auswählen müsste.
Anbei mal ein einfach Ansatz um einen Titel pro Person zu finden.
Die Feldnamen habe ich jetzt nicht 1:1, aber das Konzept sollte klar sein.
Damit sollte es dann möglich sein, den Rest umzusetzen.
SELECT u.LastName
, (
SELECT TOP 1 t.ID FROM tblTitle t WHERE LEFT(u.LastName, LEN (t.Titel)) = t.Titel ORDER BY t.Titel DESC
) AS ID_Titel
FROM tblPerson u;
Mit einem Cross Join ist das etwas problematisch.
Zitat von: Anke_71 am Dezember 20, 2023, 01:01:38Man könnte die Normalisierung natürlich auch ganz am Anfang bei der Eingabe dem Nutzer überlassen, dieses ist allerdings die Methode, die am meisten Zeit benötigt, da der Eingeber dann drei Werte einzeln einkopieren bzw. auswählen müsste.
Einen vollständigen Namen in Vor- und Nachnamen aufzutrennen wird durchaus auch eine Herausforderung sein (auf die man verzichten wollte).
Carl Maria v. Weber
Marc-André ter Stegen
Das sind zwei von vielen Beispielen, die eine automatisierte Gesamtlösung drastisch verkomplizieren werden.
Herzlichen Dank an markusxy für die Lösung! Vornamen und namen: es ist extrem aufwendig, es gibt noch viel schlimmere Beispiele als die genannten, derzeit ist die Lösung halb manuell (bei allen namen mit mehreren Leerzeichen) plus dann den Rest automatisch, aber nochmals mit einer Person, die sich das Ergebnis anschaut und Fehler dann noch manuell korrigiert.
Zitat von: Anke_71 am Dezember 20, 2023, 10:37:21es gibt noch viel schlimmere Beispiele
Es stellt sich natürlich die Frage, ob die Daten nicht normalisiert übermittelt werden können.
Titel können ja auch hinter dem Namen stehen.
Solche Daten sind mehr als grauenvoll.