Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Query mit Auswahl nur des obersten (oder größten Wertes) und Anzeige

Begonnen von Anke_71, Dezember 19, 2023, 05:51:54

⏪ vorheriges - nächstes ⏩

Anke_71

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???

 

markusxy

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.


PhilS

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.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

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?
Mit freundlichem Glück Auf!

Eberhard

Anke_71

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.

markusxy

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.

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Anke_71

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.

markusxy

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.